ページング操作で LIMIT および OFFSET を使用した後のクエリが遅い原因の分析

どうしたの

最近、バッチデータ処理関連の業務を行っているのですが、下流の企業と接続した際に、最初は業務データの取り出しが非常に速かったのですが、だんだん遅くなり、1時間で40万件のデータを取り出すことができなくなってしまいました。 。調査の結果、相手は LIMIT OFFSET という非常にトリッキーなページング クエリ手法を使用しており、データ量が多い場合にクエリ効率が極端に低下することが判明しました。

LIMIT OFFSET を使用するとクエリ効率が低下する理由を簡単に説明します — 

主な理由

1. データベース スキャン: OFFSET 値が大きい場合、データベース エンジンは OFFSET 行の前のデータをスキャンしてスキップする必要があります。これにより、データベースで大量の読み取りおよびスキップ操作が実行され、クエリのオーバーヘッドが増加します。

2. データベースの並べ替え: 通常、ページングに LIMIT と OFFSET を使用するには、クエリ結果を並べ替える必要があります。 OFFSET 値が大きい場合、大量のデータを並べ替える必要があり、クエリ時間とリソース消費も増加します。

3. メモリ使用量: OFFSET 値が大きい場合、データベースは並べ替えおよびスキップ操作のために大量のデータをメモリにロードする必要がある場合があり、メモリ使用量が増加し、データベースのパフォーマンスに影響を与えます。

解決

この問題を解決するには、カーソルベースのページングなど、他のページング手法の使用を検討してください。カーソル ページングは​​ OFFSET 値に依存せず、代わりに何らかの一意の識別子 (主キーなど) に基づくカーソルを使用して、データの次のページを取得します。この方法により、データベースのスキャンと並べ替えのオーバーヘッドが回避され、クエリのパフォーマンスが向上します。最終的にはダウンストリームでもページングに主キー ID を採用しました。

さらに、大規模なデータ セットに対するページング クエリの場合は、インデックスの最適化、キャッシュ テクノロジー、サブデータベースやテーブルなどの方法を使用してクエリのパフォーマンスを向上させることも検討できます。

要約すると、ページングに LIMIT と OFFSET を使用する場合、OFFSET 値が大きいと、大量のデータをスキャンしてスキップする必要があるため、クエリが遅くなる可能性があります。パフォーマンスを向上させるには、ページングに OFFSET を使用する代わりに、カーソル ページングまたはその他の最適化手法を使用することを検討してください。

おすすめ

転載: blog.csdn.net/m0_54701273/article/details/135001235