データベースのパフォーマンスの問題を解決するベストプラクティス
この記事では、クラウドインフラストラクチャサイト上のAdobe Commerceでデータベースのパフォーマンスに悪影響を与えるデータベースの問題を修正する方法について説明します。
影響を受けるバージョン
クラウドインフラストラクチャー上のAdobe Commerce
長時間実行中のクエリの特定と解決
MySQL クエリの実行が遅いかどうかを確認します。 クラウドインフラストラクチャプランのAdobe Commerceとその利用可能なツールに応じて、次の操作を実行できます。
MySQL でのデータベースクエリの分析
MySQL を使用すると、クラウドインフラストラクチャプロジェクト上のAdobe Commerceに対して長時間実行中のクエリを特定して解決できます。
SHOW \[FULL\] PROCESSLIST
ステートメントを実行します。- クエリの実行時間が長い場合は、クエリごとに MySQL
EXPLAIN
とEXPLAIN ANALYZE
を実行して、クエリが長時間実行される原因を調べます。 - 見つかった問題に基づいて、クエリがより迅速に実行されるように、クエリを修正する手順を実行します。
Percona Toolkit を使用したクエリの分析(Pro アーキテクチャのみ)
Adobe Commerce プロジェクトが Pro アーキテクチャにデプロイされている場合は、Percona Toolkit を使用してクエリを分析できます。
-
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 ドキュメントを参照してください。
-
見つかった問題に基づいて、クエリがより迅速に実行されるように、クエリを修正する手順を実行します。
すべてのテーブルにプライマリ・キーがあることを確認します。
プライマリキーの定義は、データベースとテーブルを適切に設計するための要件です。 プライマリキーを使用すると、任意のテーブル内の 1 つの行を一意に識別できます。
主キーのないテーブルがある場合、Adobe Commerceのデフォルトのデータベースエンジン(InnoDB)では、最初の一意の not null キーが主キーとして使用されます。 一意のキーがない場合、InnoDB は隠されたプライマリキー(6 バイト)を作成します。 暗黙的に定義されたプライマリキーの問題は、プライマリキーを制御できないことです。 さらに、暗黙の値は、プライマリキーのないすべてのテーブルに対してグローバルに割り当てられます。 この構成では、これらのテーブルに同時書き込みを実行すると、競合の問題が発生する可能性があります。 テーブルはグローバルな非表示プライマリ・キー・インデックス増分も共有するため、パフォーマンスの問題が発生する可能性があります。
テーブルにプライマリキーがない場合は、プライマリキーを定義することで、これらの問題を防ぐことができます。
プライマリキーのないテーブルの識別と更新
-
次の 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');
-
プライマリキーがないテーブルの場合は、
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
追加情報
クラウドデプロイメントにおけるデータベース設定のベストプラクティス