データベースのパフォーマンスの問題を解決するベストプラクティス

この記事では、クラウドインフラストラクチャサイト上のAdobe Commerceでデータベースのパフォーマンスに悪影響を与えるデータベースの問題を修正する方法について説明します。

影響を受けるバージョン

クラウドインフラストラクチャー上のAdobe Commerce

長時間実行中のクエリの特定と解決

MySQL クエリの実行が遅いかどうかを確認します。 クラウドインフラストラクチャプランのAdobe Commerceとその利用可能なツールに応じて、次の操作を実行できます。

MySQL でのデータベースクエリの分析

MySQL を使用すると、クラウドインフラストラクチャプロジェクト上のAdobe Commerceに対して長時間実行中のクエリを特定して解決できます。

  1. を実行 SHOW \[FULL\] PROCESSLIST ステートメント。
  2. クエリの実行に時間がかかる場合は、を実行します MySQL EXPLAIN および EXPLAIN ANALYZE それぞれについて、クエリが長時間実行される原因を調べます。
  3. 見つかった問題に基づいて、クエリがより迅速に実行されるように、クエリを修正する手順を実行します。

Percona Toolkit を使用したクエリの分析(Pro アーキテクチャのみ)

Adobe Commerce プロジェクトが Pro アーキテクチャにデプロイされている場合は、Percona Toolkit を使用してクエリを分析できます。

  1. を実行 pt-query-digest --type=slowlog mysql の低速なクエリログに対してコマンドを実行します。

    • 処理に時間のかかるクエリログの場所については、を参照してください。 Log locations > Service Logs(https://devdocs.magento.com/cloud/project/log-locations.html#service-logs)開発者向けドキュメントに記載されています。
    • を参照してください。 Percona Toolkit > pt-query-digest ドキュメント。
  2. 見つかった問題に基づいて、クエリがより迅速に実行されるように、クエリを修正する手順を実行します。

すべてのテーブルにプライマリ・キーがあることを確認します。

プライマリキーの定義は、データベースとテーブルを適切に設計するための要件です。 プライマリキーを使用すると、任意のテーブル内の 1 つの行を一意に識別できます。

主キーのないテーブルがある場合、Adobe Commerceのデフォルトのデータベースエンジン(InnoDB)では、最初の一意の not null キーが主キーとして使用されます。 一意のキーがない場合、InnoDB は隠されたプライマリキー(6 バイト)を作成します。 暗黙的に定義されたプライマリキーの問題は、プライマリキーを制御できないことです。 さらに、暗黙の値は、プライマリキーのないすべてのテーブルに対してグローバルに割り当てられます。 この構成では、これらのテーブルに同時書き込みを実行すると、競合の問題が発生する可能性があります。 テーブルはグローバルな非表示プライマリ・キー・インデックス増分も共有するため、パフォーマンスの問題が発生する可能性があります。

テーブルにプライマリキーがない場合は、プライマリキーを定義することで、これらの問題を防ぐことができます。

プライマリキーのないテーブルの識別と更新

  1. 次の SQL クエリを使用して、プライマリキーのないテーブルを識別します。

    code language-sql
    SELECT table_catalog, table_schema, table_name, engine FROM information_schema.tables        WHERE (table_catalog, table_schema, table_name) NOT IN (SELECT table_catalog, table_schema, table_name FROM information_schema.table_constraints  WHERE constraint_type = 'PRIMARY KEY') AND table_schema NOT IN ('information_schema', 'pg_catalog');
    
  2. プライマリキーがないテーブルの場合は、を更新してプライマリキーを追加します。 db_schema.xml (宣言型スキーマ)次のようなノードを持つもの。

    code language-html
    <constraint xsi:type="primary" referenceId="PRIMARY">         <column name="id_column"/>     </constraint>
    

    ノードを追加したら、 referenceID および column name カスタム値を使用した変数。

詳しくは、を参照してください 宣言スキーマの設定 開発者向けドキュメントを参照してください。

重複するインデックスの特定と削除

データベース内の重複するインデックスを特定して削除します。

重複するインデックスのチェック

Pro または Starter クラウドアーキテクチャで重複したインデックスをチェックするには、次の SQL クエリを実行します。

SELECT s.INDEXED_COL,GROUP_CONCAT(INDEX_NAME) FROM (SELECT INDEX_NAME,GROUP_CONCAT(CONCAT(TABLE_NAME,'.',COLUMN_NAME) ORDER BY CONCAT(SEQ_IN_INDEX,COLUMN_NAME)) 'INDEXED_COL' FROM INFORMATION_SCHEMA.STATISTICS WHERE TABLE_SCHEMA = 'db?' GROUP BY INDEX_NAME)as s GROUP BY INDEXED_COL HAVING COUNT(1)>1

クエリを実行すると、列名と、重複するインデックスの名前が返されます。

Pro アーキテクチャのマーチャントは、Percona Toolkit を使用してチェックを実行することもできます [pt-duplicate-key checker](https://www.percona.com/doc/percona-toolkit/LATEST/pt-duplicate-key-checker.html%C2%A0) コマンド。

重複するインデックスの削除

SQL の使用 DROP INDEX 文 重複するインデックスを削除します。

DROP INDEX

追加情報

クラウドデプロイメントにおけるデータベース設定のベストプラクティス

recommendation-more-help
754cbbf3-3a3c-4af3-b6ce-9d34390f3a60