mysql ページング中にオフセットが大きすぎる場合の SQL 最適化例の共有

小云云
リリース: 2017-12-25 11:16:37
オリジナル
2092 人が閲覧しました

コンテンツをリストに表示すると、リスト内のコンテンツの量は多くなる可能性がありますが、ユーザーが一度に表示できるインターフェイスのサイズは限られているため、必然的にページングの問題が発生します。すべてのコンテンツを 1 つのインターフェイス上で一度に取得すると、バックエンドにさらなる負荷がかかります。 MySQL ページングは​​開発中によく遭遇する機能ですが、この機能を実装する際に問題が発生したため、この記事では主に mysql ページング時の過剰なオフセットの SQL 最適化体験を紹介します。あらゆる人の学習や仕事に役立つ学習価値があり、それを必要とする友人は編集者をフォローして見ることができます。

通常、ページングクエリを実行するときは次のようなステートメントが使用されます:

SELECT
*
FROM table
where condition1 = 0
and condition2 = 0
and condition3 = -1
and condition4 = -1
order by id asc
LIMIT 2000 OFFSET 50000
ログイン後にコピー

オフセットが特に大きい場合、このステートメントの実行効率は大幅に低下し、オフセットが増加するにつれて効率も低下します。

その理由は、

MySQL はオフセット行をスキップせず、オフセット + N 行を取得し、その後諦める前にオフセット行を返し、オフセットが特に大きい場合は N 行を返します。現時点では、単一のデータも非常に大きくなり、各クエリでより多くのデータを取得する必要があるため、当然のことながら非常に時間がかかります。

最適化計画:


SELECT
*
FROM table
JOIN
(select id from table
where condition1 = 0
and condition2 = 0
and condition3 = -1
and condition4 = -1
order by id asc
LIMIT 2000 OFFSET 50000)
as tmp using(id)
ログイン後にコピー

または


SELECT a.* FROM table a, 
(select id from table
where condition1 = 0
and condition2 = 0
and condition3 = -1
and condition4 = -1
order by id asc
LIMIT 2000 OFFSET 50000) b 
where a.id = b.id
ログイン後にコピー

まず主キーリストを取得し、次に主キーを介してターゲットデータをクエリします。オフセットが大きい場合でも、すべてのフィールド データを取得する代わりに、多くの主キーが取得されるため、比較的効率的になります。

関連する推奨事項:

MySQL 最適化の概要 - クエリの総数

一般的に使用される mysql 最適化 SQL ステートメントのクエリ方法の概要

MySQL の最適化には 3 つの側面が含まれます

以上がmysql ページング中にオフセットが大きすぎる場合の SQL 最適化例の共有の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート