Skip to content

SQLクエリをClaudeで最適化する

パフォーマンスが出ないSQLクエリに悩んだことはありませんか?Claude Codeを使えば、EXPLAINの出力を貼り付けるだけで原因分析からインデックス設計の提案まで、一気通貫で対応できます。

EXPLAINの結果をそのまま貼り付けて分析させる

Section titled “EXPLAINの結果をそのまま貼り付けて分析させる”

まずはMySQLやPostgreSQLのEXPLAIN結果をClaudeに渡してみましょう。以下のように実行結果をそのままプロンプトに含めます。

以下のEXPLAIN結果を分析して、パフォーマンス上の問題点を教えてください。
EXPLAIN SELECT orders.id, users.name
FROM orders
JOIN users ON orders.user_id = users.id
WHERE orders.status = 'pending'
AND orders.created_at > '2024-01-01';
+----+-------------+--------+------+---------------+------+---------+------+--------+-------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+--------+------+---------------+------+---------+------+--------+-------------+
| 1 | SIMPLE | orders | ALL | NULL | NULL | NULL | NULL | 980000 | Using where |
| 1 | SIMPLE | users | ALL | NULL | NULL | NULL | NULL | 50000 | |
+----+-------------+--------+------+---------------+------+---------+------+--------+-------------+

type: ALLrows: 980000という数値を見たClaudeは、フルテーブルスキャンが発生していることをすぐに指摘してくれます。「どのカラムにインデックスを張るべきか」まで具体的に提案してもらえるのが便利な点です。

インデックス: データベースの検索を高速化するための索引データ。適切に設定しないとクエリが遅くなる。プロンプト: AIへの指示文。Claude Codeへの指示の質がそのまま出力の質に影響する。

インデックス設計の提案を引き出す

Section titled “インデックス設計の提案を引き出す”

問題を把握したら、続けて次のように聞きましょう。

上記の問題を解消するために最適なインデックスをCREATE INDEX文で提案してください。
複合インデックスが有効な場合はその理由も説明してください。

するとClaudeは以下のようなSQLと解説をセットで返してくれます。

-- statusとcreated_atの複合インデックス(絞り込み条件に対応)
CREATE INDEX idx_orders_status_created
ON orders (status, created_at);
-- JOINのキーになるuser_idにもインデックスを追加
CREATE INDEX idx_orders_user_id
ON orders (user_id);

カーディナリティの高いカラムを先頭に置く理由なども自動的に説明してくれるため、インデックス設計の学習にも役立ちます。

クエリ自体のリライトも依頼する

Section titled “クエリ自体のリライトも依頼する”

インデックスだけでは解決しないケースもあります。サブクエリの書き換えやJOINの順序変更など、クエリ構造の改善を依頼するときはこのように指示しましょう。

このクエリをパフォーマンスを意識して書き直してください。
EXISTS句やCTEの活用も検討してください。

Claudeはビフォー・アフターの形式でリライト案を提示してくれます。変更点とその理由も添えて説明してくれるので、レビューや社内共有にもそのまま使えます。EXPLAINの結果を貼るところから始めて、ぜひ一度試してみてください。