- 開発技術
SQLパフォーマンス改善のポイント
- SQL

目次
はじめに
【エンジニア募集中】フルリモート可◎、売上/従業員数9年連続UP、平均残業8時間、有給取得率90%、年休124日以上 etc. 詳細はこちらから>
SQL文を書いていく中で、パフォーマンスの違いに気づくことがありました。この記事では、自分なりに調べたり試したりして「これは使えそう」と思ったSQL最適化のヒントを共有いたします。今後のSQLチューニングや開発時の参考になれば幸いです。
1. 必要なカラムだけを指定する
SELECT * は避け、必要なカラムのみを指定しましょう。
悪い例:
1 |
SELECT * FROM users; |
良い例:
1 |
SELECT name, email FROM users; |
無駄なデータ転送を減らし、パフォーマンス向上につながります。
2. インデックス(索引)を適切に利用する
WHERE や JOIN、ORDER BY に使うカラムにはインデックスを設定すると、検索速度が大幅に向上します。
例:
1 |
CREATE INDEX idx_users_email ON users(email); |
※注意:インデックスが多すぎると、INSERT・UPDATE・DELETE の処理が遅くなる可能性があります。
3. WHERE句内でカラムに関数を使わない
関数を使うとインデックスが無効になることがあります。
非効率な例:
1 |
SELECT * FROM users WHERE YEAR(created_at) = 2024; |
効率的な例:
1 |
SELECT * FROM users WHERE created_at >= '2024-01-01' AND created_at < '2025-01-01'; |
4. 不要な複雑なJOINを避ける
必要なテーブルだけをJOINし、エイリアス(別名)を使って読みやすくしましょう。
例:
1 2 3 |
SELECT u.name, o.total FROM users u JOIN orders o ON u.id = o.user_id; |
5. 大量のデータにはINよりEXISTSを使う
INはサブクエリの結果が多い場合にパフォーマンスが低下しがちです。
より高速な例:
1 2 3 4 |
SELECT name FROM users u WHERE EXISTS ( SELECT 1 FROM orders o WHERE o.user_id = u.id ); |
6. LIMITやページネーションでデータ量を制限する
大量データを扱う際は、ページングで処理を分割しましょう。
例:
1 |
SELECT * FROM products ORDER BY created_at DESC LIMIT 20 OFFSET 0; |
7. EXPLAINでクエリの実行計画を確認する
MySQLやPostgreSQLでは、EXPLAINでクエリがどのように実行されるかを確認できます。
例:
1 |
EXPLAIN SELECT * FROM users WHERE email = 'abc@example.com'; |
これにより、インデックスが使用されているか、どこがボトルネックかを把握できます。
8. サブクエリの使いすぎに注意する
サブクエリを多用すると、パフォーマンスが低下する可能性があります。
遅い例:
1 2 |
SELECT name, (SELECT COUNT(*) FROM orders WHERE user_id = u.id) as order_count FROM users u; |
より効率的な例:
1 2 3 4 |
SELECT u.name, COUNT(o.id) as order_count FROM users u LEFT JOIN orders o ON u.id = o.user_id GROUP BY u.id; |
結論
SQLを最適化することで、アプリケーションのパフォーマンスが大きく改善され、データベースの負荷も軽減されます。定期的にクエリを見直して改善していきましょう!
【エンジニア募集中】フルリモートも◎(リモート率85.7%)、平均残業8時間、年休124日以上、有給取得率90% etc. 詳細はこちらから>