効率的なMySQLページングの詳細な説明

効率的なMySQLページングの詳細な説明

序文

通常、大量のデータを扱う MySQL クエリには「ページング」戦略が採用されます。ただし、ページを後の位置に移動すると、MySQL は破棄する必要のあるデータをスキャンするのに多くの時間を費やすため、クエリは非常に遅くなります。

基本的なページングテクニック

通常、効率的なページングを実現するには、クエリ内の WHERE 条件列とソート列に結合インデックスを適用する必要があります。
たとえば、インデックス (a, b, c) を作成すると、次のクエリでインデックスを使用できるようになり、クエリの効率が向上します。

1. フィールドの並べ替え

注文する 
a,b で順序付け
a、b、c で​​順序付け 
ORDER BY a DESC、b DESC、c DESC 

2. フィルタリングと並べ替え

a = const ORDER BY b, c の場合 
a = const かつ b = const の場合、c で ORDER BY する 
a = const ORDER BY b, c の場合 
a = const かつ b > const の場合、b, c で ORDER BY する 

3. 次のクエリは上記のインデックスを使用できません

ORDER BY a ASC, b DESC, c DESC // ソート方向が一貫していません WHERE g = const ORDER BY b, c // フィールド g はインデックスの一部ではありません WHERE a = const ORDER BY c // フィールド b は使用されていません 
WHERE a = const ORDER BY a, d // フィールド d はインデックスの一部ではありません

大量のデータのページめくりの問題を解決

1. LIMIT M,NのクエリをLIMIT Nに変更します。
たとえば、LIMIT 10000,20 の場合、MySQL は最初の 10,000 行を読み取ってから次の 20 行を取得する必要があり、これは非常に非効率的です。LIMIT N を使用すると、各ページの最初または最後のレコードの ID でフィルタリングし、降順と昇順を使用して前/次のページの結果セットを取得できます。
2. ユーザーが閲覧できるページ数を制限します。実際の製品使用では、ユーザーが 10,000 番目の検索結果を気にすることはほとんどありません。
3.遅延連想法を使う
カバーリング インデックスを使用してクエリを実行し、必要な主キーを返し、返された主キーを元のテーブルに関連付けて必要な行を取得することで、Mysql がスキャンして破棄する必要がある行の数を減らすことができます。

例:
インデックス (性別、評価) を使用したクエリ:

mysql> SELECT <cols> FROM profiles INNER JOIN (
-> SELECT <主キー列> FROM プロファイル
-> WHERE x.sex='M' ORDER BY 評価 LIMIT 100000, 10
-> ) AS x USING(<主キーの列>);

以上がこの記事の全内容です。皆様の勉強のお役に立てれば幸いです。また、123WORDPRESS.COM を応援していただければ幸いです。

以下もご興味があるかもしれません:
  • MySQL ページングの原理と効率的な MySQL ページング クエリ ステートメント
  • MySQL 百万レベルのページング最適化 (MySQL 千万レベルの高速ページング)
  • MySQL 制限ページング最適化方法の共有
  • 3 つのデータベース (Oracle、MySQL、SqlServer) のページング クエリの例
  • php+mysql ページングコードの詳細な説明
  • mysql+php ページングクラス (テスト済み)
  • MySQL ページング最適化分析
  • Mysqlの制限を最適化し、100万から1000万までの高速ページングの複合インデックスを参照し、軽量フレームワークに適用します。
  • PHP で SELECT ステートメントを使用して MySQL ページング クエリを実装する方法
  • MySQL のページングクエリの 2 つのソリューションの比較

<<:  CentOS7 ファイアウォールとオープンポートの簡単な使い方の簡単な紹介

>>:  JSはカード配布アニメーションを実現します

推薦する

MySQL の文字セット utf8 を utf8mb4 に変更する方法

MySQL 5.5 の場合、文字セットが設定されていない場合、MySQL のデフォルトの文字セットは...

Docker コマンドラインの完全ガイド (知っておくべき 18 のこと)

序文Docker イメージは Dockerfile といくつかの必要な依存関係で構成され、Docke...

CSS 前景と背景の自動カラーマッチング技術の紹介 (デモ)

1. カラーマッチング効果のプレビュー下の GIF に示すように、ボタンの背景色が徐々に薄くなると...

vagrant+virtualBoxで仮想マシンを構築する方法

1. はじめにVagrant は、仮想マシン (VirtualBox) を構築および管理するためのツ...

JavaScript配列をツリー構造に変換する方法

1. 需要バックエンドは、フロントエンドがツリー構造(重複データなし)に変換するためのデータを提供し...

レスポンシブレイアウトについて知っておくべきこと

1. はじめにレスポンシブ Web デザインにより、Web サイトは複数のデバイスと複数の画面に同時...

forEachでawaitが機能しない問題を解決する

1. はじめに数日前、プロジェクトでトラバーサルに使用したときに落とし穴に遭遇し、解決するのに 1 ...

アバター変更機能を実装するJavaScript

この記事では、アバター変更機能を実装するためのJavaScriptの具体的なコードを参考までに共有し...

CentOS7.5 の MySQL8.0.19 のインストールチュートリアルの詳細な手順

1. はじめにこの記事には MySQL インストール部分のスクリーンショットがないので、ある程度の基...

Docker JVM メモリ使用量の表示

1. Docker コンテナのホスト マシンに入り、指定されたイメージを実行しているコンテナ ID ...

Ubuntu でパスワードを変更し、パスワードの複雑さのポリシーを設定する方法

1. パスワードを変更する1. 一般ユーザーのパスワードを変更する パスワード現在のパスワードを入力...

Ubuntu 20.04にROS Noeticをインストールする方法

免責事項:プロジェクトでは ROS 環境を使用する必要があるため、これは Ubuntu 20.04 ...

Docker+nacos+seata1.3.0 のインストールと使用設定チュートリアル

これに先立ち、1日かけてやってみました。Seataは使い方が簡単で超シンプルですが、インストールや設...

Vue Elementのテーブルコンポーネントをカプセル化する方法

Vue コンポーネントをカプセル化する場合でも、機能コンポーネントをクロスファンクショナルに使用しま...

nginx で複数の仮想ホストを設定する方法の例

nginx で仮想ホスト vhost を設定すると非常に便利です。 nginx設定ファイルnginx...