担当している機能で、DB処理に時間がかかり、全体の実行時間が長くなる問題 に直面しました。
特に大量データを一括で処理する部分は負荷が大きく、改善が必要な状況です。
実施した改善と効果
インデックスの追加
クエリ実行計画 EXPLAIN
を確認しながらインデックスを追加しました。
しかし、実行時間にはほとんど影響がなく、大きな改善は見られませんでした。
💡 カーディナリティが低いカラムでは、インデックスが効きにくいことを実感しました。
Eloquent → 生SQL への書き換え
Laravel Eloquent を生SQLに書き換えました。
処理内容は分かりやすくなりましたが、パフォーマンス上の効果はほとんどなし。
array_chunk
によるループ分割処理
一括で処理していた配列を、1000件単位で分割してループ処理。
👉 処理速度が約4倍高速化に成功 🎉
現在の課題
改善は進みましたが、以下の課題は残っています
- クエリ構造が複雑(JOINが多い、サブクエリなど)
- 一部のクエリにインデックスが効いていない可能性
- 大量のループ処理・配列操作による CPU/メモリ負荷
今後の対応方針
-
EXPLAIN
を再確認して、どこにインデックスが効いていないかチェック - スロークエリログの取得・分析
- クエリの分割やリファクタリングを含めて再検討
- アプリケーション側での並列処理・バッチ処理の導入検討
補足:改善の工夫アイデア
-
アプリケーション側の処理改善
1万件を一気に処理するのではなく、5000件単位に分割して並列処理(Laravelでも可能) -
chunk_by_id()
の活用
Laravel のchunk_by_id()
を使い、IDを基準に効率的にデータを取得 -
GroupBy の見直し
文字列などで groupBy していた処理を ID ベースに変更すると高速化できる
まとめ
- インデックスや生SQL化だけでは効果が薄いケースもある
-
array_chunk()
による分割処理で約4倍の高速化に成功 - カーディナリティを意識したインデックス設計や、アプリ側の工夫も重要
- 今後はクエリの見直しや並列処理の導入でさらなる改善を目指す
実務で「インデックスを貼ったのに速くならない…」と悩んでいる方や、大量データ処理で苦労している方の参考になれば幸いです。