1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

🚀 大量データ処理でDBが遅い!改善してみたら4倍速くなった話

Last updated at Posted at 2025-09-26

担当している機能で、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倍の高速化に成功
  • カーディナリティを意識したインデックス設計や、アプリ側の工夫も重要
  • 今後はクエリの見直しや並列処理の導入でさらなる改善を目指す

実務で「インデックスを貼ったのに速くならない…」と悩んでいる方や、大量データ処理で苦労している方の参考になれば幸いです。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?