こんにちは!
MagentoおよびAdobe Commerce(以下まとめてMagento)でクエリーのログを取る方法や、スロークエリーの発生個所を特定する方法などを解説したいと思います。
クエリーログ
Magentoには様々なログが出力されますが、SQLの実行内容をログに出力する機能もあります。
これ利用すると実行されているクエリーの詳細や実行に要した時間などを確認することが出来ます。全てのクエリーをログに出力することだけでなく、閾値指定によってスロークエリーのみを出力することも出来、クエリーを実行している箇所をスタックトレースとして出力する事も可能です。
クエリーログの有効化
Magentoでクエリーログを有効にするには下記のコマンドで行います。
(大量のログが出力されるのでここではひとまずスタックトレースを無効にしています)
bin/magento dev:query-log:enable --include-call-stack=false
ログを有効にしたらキャッシュをフラッシュします
bin/magento c:f
これでMagento内で発行される全てのSQLのログを取ることが出来ます。
クエリーログの無効化
無効化する場合は下記のコマンドで行います。
bin/magento dev:query-log:disable
bin/magento c:f
ログの出力先
クエリーログは下記のファイルに出力されます。
ログの内容
ログは、下記のような内容で出力されます。
① ## 2025-05-11 05:36:03
② ## 3645 ## QUERY
③ SQL: SELECT `layout_update`.`xml`, `layout_update`.`handle` FROM `layout_update`
INNER JOIN `layout_link` AS `link` ON link.layout_update_id=layout_update.layout_update_id WHERE (link.store_id IN (0, :store_id)) AND (link.theme_id = :theme_id) AND (link.is_temporary = 0) ORDER BY `layout_update`.`sort_order` ASC
④ BIND: array (
':theme_id' => '3',
':store_id' => '2',
)
⑤ AFF: 18
⑥ TIME: 0.0007
⑦ TRACE: ・・・
① 実行日時
② プロセスIDと手続きの種類(CONNECT、QUERY、TRANSACTION BEGINなど)
③ クエリー本文
④ プレースフォルダを使用している場合、プレースフォルダにバインドされた値
⑤ 実行結果として返された件数
⑥クエリーの実行時間
⑦スタックトレース ※--include-call-stack=true(デフォルト)のときのみ出力される
プロセスIDについて
Magentoでは複数のプロセスが同時に稼働しているので、ログの中に様々な処理のクエリーが入り乱れます。1つのプロセスの一連のクエリーを確認したい場合はログの中のプロセスID(②)に注目して同じプロセスで実行されているログを追いかけるようにします。
クエリーの実行時間とスロークエリー
デフォルトでは全てのクエリーのログが出力されますが、クエリーの実行に時間がかかっているものだけを出力してスロークエリーを調べることも出来ます。
下記のオプションを指定してクエリーログを有効にします。ログへの出力が閾値以上のもののみとなります。
bin/magento dev:query-log:enable --include-all-queries=false --query-time-threshold=<閾値> --include-call-stack=false
--include-all-queries →falseを指定すると閾値が有効となります(デフォルト:true)
--query-time-threshold →閾値(デフォルト: 0.001)
スロークエリーの発生個所を知りたいとき
スロークエリーが発生している箇所を特定したい場合、オプション--include-call-stack=ture(デフォルト)を使用する事で、クエリーがコールされた箇所のスタックトレースが同時にログに出力されます。
※ログが大量になりがちなので注意して使用してください
まとめ
以上、Magentoでクエリーログを確認する方法でした。
コマンドで手軽にログの出力をオンオフできるので非常に便利ですね。スロークエリーの調査や、一連の処理でどういったSQLが発行されているのかを知りたい場合などに利用してみてください。大量のログが出力されるので常時使用することは避けたほうがよいです、使用時は注意して使用してください。