コンテンツへスキップ
uencoder

遅い SQL クエリを最適化する

EXPLAIN による分析、インデックスの最適化、クエリの書き換えテクニックを使って、遅い SQL クエリを特定して修正します。

  1. 1

    クエリ最適化の手順: (1) EXPLAIN ANALYZE を実行して実行プランを確認する。(2) 大きなテーブルでのシーケンシャルスキャンを探し、インデックスを追加する。(3) 結合方式を確認する — 大きなテーブルではネステッドループは遅い。(4) JOIN の前に WHERE で作業セットを減らす。(5) SELECT * を避け、必要な列だけを取得する。(6) ページネーションには OFFSET ではなく LIMIT ベースの方式を使う。

  2. 2
    SQL フォーマッター →

    分析の前にクエリを読みやすく整形します。適切に整形されたクエリは非効率の発見を容易にします。WHERE 句の欠落、不要なサブクエリ、冗長な JOIN などです。整形は、クエリと EXPLAIN 出力を突き合わせるときにも役立ちます。

  3. 3

    SQL 整形ワークフローを使って、クエリを整形・分析・ドキュメント化します。一貫したインデント付きの整然とした読みやすいクエリが得られ、最適化しやすくなります。

よくある質問

インデックスはいつ追加すべきですか?
WHERE、JOIN、ORDER BY 句で使われる列にインデックスを追加してください。複数列の条件には複合インデックスを使います (順序が重要 — 等値条件を先頭に)。カーディナリティの低い列 (真偽値、性別など) へのインデックスは避けてください。ほとんど役に立たないためです。インデックスの使用状況を監視し、未使用のインデックスは削除します (書き込みが遅くなるため)。
ページネーションで OFFSET が良くないのはなぜですか?
OFFSET は、行を走査して捨てることでスキップします。LIMIT 10 で 1000 ページ目を取ると 10,010 行を走査します。代わりに keyset ページネーション (WHERE id > last_id ORDER BY id LIMIT 10) を使ってください。必要な 10 行だけを走査します。複雑なソート順には、複合カーソル (ソート列 + 一意 ID) を使います。

このタスクを解決するワークフロー

関連ツール