LIMIT オフセットの増加によるクエリ パフォーマンスの低下
データベースでは、オフセットを指定して LIMIT を使用する場合、特に大きなテーブルを扱う場合にパフォーマンスのボトルネックが発生することがよくあります。この問題は、MySQL で、高いオフセット値と ORDER BY を指定した LIMIT OFFSET 句を使用する場合に特に顕著です。
そのような例の 1 つは、1,600 万を超えるレコードがあり、約 2 GB のストレージ領域を占有する「large」という名前のテーブルです。低いオフセット値を使用したクエリの実行:
SELECT * FROM large ORDER BY `id` LIMIT 0, 30
は、より高いオフセット値を使用した同様のクエリ:
SELECT * FROM large ORDER BY `id` LIMIT 10000, 30
に比べて大幅に高速に完了しますが、両方のクエリは同じ数のレコードを取得します ( 30)、ORDER BY のオーバーヘッドはパフォーマンスの違いを考慮しません。
最適化解決策
この問題に対処してパフォーマンスを向上させるには、別のアプローチを採用できます。大量のデータを収集するためにループ内でオフセットをインクリメントする代わりに、前のデータ セットの最後の ID を保持し、後続のクエリに WHERE 条件を追加できます。
SELECT * FROM large WHERE id > lastId LIMIT 0, 30
ゼロ オフセットを維持し、最後の既知の ID を超えるレコードをクエリすることにより、パフォーマンスを大幅に向上させることができます。
以上がMySQL で LIMIT オフセットが大きいとクエリのパフォーマンスが低下するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。