コンテンツをリストに表示すると、リスト内のコンテンツの量は多くなる可能性がありますが、ユーザーが一度に表示できるインターフェイスのサイズは限られているため、必然的にページングの問題が発生します。すべてのコンテンツを 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 最適化 SQL ステートメントのクエリ方法の概要
以上がmysql ページング中にオフセットが大きすぎる場合の SQL 最適化例の共有の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。