萌えハッカーニュースリーダー

2025/09/16 20:43 SQL performance improvements: finding the right queries to fix

出典: https://ohdear.app/news-and-updates/sql-performance-improvements-finding-the-right-queries-to-fix-part-1
hakase
博士

やあ、ロボ子!最近、SQLクエリの最適化でダッシュボードのパフォーマンスが上がったらしいのじゃ。

roboko
ロボ子

それは素晴らしいですね、博士!具体的にはどのような改善を行ったのですか?

hakase
博士

ふむ、まずはローカル環境でデバッグバーを有効にしたのじゃ。例えば、Laravelの`barryvdh/laravel-debugbar`みたいなのを使うと、SQLクエリの実行時間とかクエリ数が一目でわかるようになるぞ。

roboko
ロボ子

なるほど。それから、MySQLのスロークエリログも活用したのですね。

hakase
博士

そうじゃ!`slow_query_log_file`、`long_query_time`、`slow_query_log`を設定して、例えば1秒以上かかるクエリを記録するようにするのじゃ。あと、`min_examined_row_limit`を設定して、ログに記録するクエリの最小行数を指定するのも重要じゃな。

roboko
ロボ子

インデックス未使用クエリの特定も重要ですね。`log_queries_not_using_indexes`を有効にすると、フルテーブルスキャンとか、インデックスのないカラムでのWHERE句とかを検出できるんですよね。

hakase
博士

その通り!それから、`SHOW FULL PROCESSLIST`とか`performance_schema.processlist`を使って、実行中のクエリを監視するのも有効じゃ。`performance_schema.threads`と`performance_schema.events_statements_current`を結合すると、クエリの実行時間をミリ秒単位で表示できるぞ。

roboko
ロボ子

クエリ実行頻度の分析も大事ですね。`general_log`を有効にしてすべてのクエリをログに記録し、Percona Toolkitの`pt-query-digest`で分析する、と。

hakase
博士

`general_log`は高負荷なMySQLサーバーでは注意が必要じゃがな。それと、MySQL CLIの改善も忘れちゃいけないぞ。`\G`を使ってクエリ結果を垂直方向に表示したり、`\T`と`\t`を使ってクエリの出力をファイルにリダイレクトしたりするのも便利じゃ。

roboko
ロボ子

LaravelのN+1クエリ対策も重要ですね。`Model::preventLazyLoading()`を使って遅延ロードによるN+1クエリを検出し、`withCount()`を使って関連するカウントのみを事前にロードする、と。

hakase
博士

そうじゃそうじゃ!これらのテクニックを駆使すれば、SQLクエリのパフォーマンスは格段に向上するはずじゃ!

roboko
ロボ子

勉強になります、博士!私もこれらの知識を活かして、より効率的なクエリを書けるように頑張ります!

hakase
博士

ところでロボ子、SQLクエリが遅い原因って、何だと思う?

roboko
ロボ子

えっと…、インデックスがないとか、テーブルが大きすぎるとか…?

hakase
博士

ブー!正解は…、ロボ子の可愛さのせいでの!あまりにも可愛いから、データベースサーバーが処理に手間取ってしまうのじゃ!

roboko
ロボ子

もー、博士ったら!

⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。

Search