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

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

影響を受けるバージョン

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

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

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

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

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

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

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

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

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

    • 処理に時間のかかるクエリログの場所については、開発者向けドキュメントの Log locations > Service Logs (https://experienceleague.adobe.com/ja/docs/commerce-cloud-service/user-guide/develop/test/log-locations#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