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

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

問題を見つける

コンテンツをリストで表示すると、リスト内のコンテンツの数は多いかもしれませんが、ユーザーが一度に表示されるインターフェースのサイズは限られているため、必然的にページングの問題が発生します。 1 つのインターフェースにすべてのコンテンツを表示することは不可能です。 バックエンドから一度に取得するデータが多すぎると、バックエンドに余分な負荷がかかります。

通常、ページング クエリには次のステートメントが使用されます。

選択
*
テーブルから
条件1 = 0の場合
条件2 = 0
条件3 = -1
条件4 = -1
ID昇順で並べ替え
制限 2000 オフセット 50000

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

理由は次のとおりです。

MySQL はオフセット行をスキップせず、オフセット + N 行を取得し、前のオフセット行を返して N 行を返します。オフセットが特に大きく、単一のデータも大きい場合、クエリを実行するたびに取得する必要があるデータが多くなり、速度が低下します。

最適化計画:

選択
*
テーブルから
参加する
(テーブルからIDを選択
条件1 = 0の場合
条件2 = 0
条件3 = -1
条件4 = -1
ID昇順で並べ替え
制限 2000 オフセット 50000)
tmp として (id) を使用

または

テーブルaからa.*を選択します。 
(テーブルからIDを選択
条件1 = 0の場合
条件2 = 0
条件3 = -1
条件4 = -1
ID昇順で並べ替え
制限 2000 オフセット 50000) b 
ここで、a.id = b.id

まず主キーリストを取得し、次に主キーで対象データを照会します。オフセットが大きい場合でも、すべてのフィールドデータではなく、多くの主キーが取得されます。相対的に効率が大幅に向上します。

要約する

上記はこの記事の全内容です。この記事の内容が皆さんの勉強や仕事に少しでもお役に立てれば幸いです。ご質問があれば、メッセージを残してコミュニケーションしてください。123WORDPRESS.COM をご愛顧いただき、ありがとうございます。

以下もご興味があるかもしれません:
  • MySQLの制限を使用して大規模なページングの問題を解決する方法
  • ビッグデータの場合のMySQLのシンプルなページング最適化方法
  • MySQL 百万レベルのページング最適化 (MySQL 千万レベルの高速ページング)
  • MYSQL ページング制限速度の最適化方法が遅すぎる
  • MySQL 制限ページング最適化方法の共有
  • MySQL 百万レベルのデータページングクエリ最適化ソリューション
  • Mysqlの制限を最適化し、100万から1000万までの高速ページングの複合インデックスを参照し、軽量フレームワークに適用します。
  • MySQL ページング最適化分析
  • 数千万のデータを扱うMySQLのページングクエリのパフォーマンスを最適化する
  • MySQL 最適化チュートリアル: 大規模なページングクエリ

<<:  Reactの親コンポーネントと子コンポーネント間のデータ転送の詳細な説明

>>:  nginx 設定チュートリアルにおける add_header の落とし穴の詳細な説明

推薦する

Dockerコンテナにvimコマンドがない問題を解決する方法

問題を見つける今日、Docker コンテナ内のファイルを変更しようとしたところ、コンテナ内に vim...

選択ドロップダウンメニューのテキストを左右にスクロールするように設定する

marquee タグを使用してフォントのスクロールを設定したいです。コードは次のように記述しましたが...

MySQLで大きなテーブルを正常に削除する方法の詳細な説明

序文テーブルを削除するには、無意識に思い浮かぶコマンドは、DROP TABLE "テーブル...

MySQL5.7.17 winx64 インストール バージョン構成方法 Windows Server 2008 R2 でのグラフィック チュートリアル

参考までに、Winでmysql5.7をインストールします。具体的な内容は次のとおりです。 @Auth...

HTML における DTD の使用法の概要

DTD はマークアップの文法規則のセットです。これは XML 1.0 仕様の一部であり、HTML フ...

Vue ページ監視ユーザープレビュー時間機能実装コード

最近のビジネスでは、オンライン トレーニング システムが特定のオンライン プレビュー ページに対する...

MySQL における引用符とバックティックの違いと使い方の詳細な説明

序文そこでこのブログを書きました。このブログでは大物の記事からいくつかの知識も推奨しています。侵害が...

Javascript サンプル プロジェクトでの虫眼鏡効果の実装プロセス

目次序文事例: JD.com の虫眼鏡効果の模倣オフセットシリーズクライアントシリーズスクロールシリ...

非ルートユーザーを使用してDockerコンテナでスクリプト操作を実行する

アプリケーションをコンテナ化した後、Docker コンテナを起動すると、デフォルトで root ユー...

MySQLにデータを素早くインポートする方法

序文:日々の勉強や仕事の中で、データをエクスポートする必要に迫られることがよくあります。たとえば、デ...

Vue2 キューブUI 時間セレクターの詳細な説明

目次序文1. 需要と効果必要効果2. コードの実装index.vue(html)日付方法テスト結果3...

mysql-canal-rabbitmq のインストールと展開の非常に詳細なチュートリアル

目次1.1. MySQL binlog を有効にする1.2. RabbitMQ の交換とキューを構成...

Vueトップタグ閲覧履歴の実装

目次ナンセンス実装された機能文章要点ナンセンスデモプレビュー実装された機能デフォルトでホームページが...

Windows 2008 Server サブドメインを親ドメインに追加すると、ドメインが既に存在するというエラー メッセージが表示されます。

Windows 2008 Serverのサブドメインを親ドメインに参加させると、「ドメインは既に存...

Docker 構成コンテナの場所とヒントのまとめ

Docker の使用に関するヒント1. 停止したDockerコンテナをすべてクリーンアップする停止し...