効率的な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はカード配布アニメーションを実現します

推薦する

Vueは左上と右上のスライドナビゲーションを実装します

ナビゲーションなどは日々の開発でよく使うので、記録として記事を書きます。ナビゲーションは終了/開始位...

Linux Centos8 CA証明書作成チュートリアル

必要なファイルをインストールする Yum インストール openssl-* -yデータベースインデッ...

仕事の効率を上げるJS略語スキル20選

目次複数の変数を同時に宣言する場合は、1 行に短縮できます。分割代入は複数の変数に同時に値を割り当て...

Linux での crontab スケジュール実行コマンドの詳細な説明

LINUX では、定期的なタスクは通常、cron デーモン プロセス [ps -ef | grep ...

MySQLにおける正規表現の一般的な使用法

MySQL における Regexp の一般的な使用法特定の文字列を含むあいまい一致# コンテンツフィ...

MySQLクエリで大文字と小文字を区別しない問題を解決する方法

質問最近、SSH フレームワークを使用して実用的なプロジェクトを完了していたときに、長い間悩まされて...

Docker tomcatのメモリサイズを設定する方法

Docker に Tomcat をインストールする場合、大きなファイルをダウンロードするときなど、場...

Linux環境でユーザーにsudo権限を追加する方法

sudo 設定ファイルsudo のデフォルトの設定ファイルは /etc/sudoers です。一般的...

MySQL InnoDB ロックの概要

目次1. 共有ロックと排他ロック2. 意図ロック3. レコードロック4. ギャップロック5. ネクス...

2017 最新バージョンの Windows インストール MySQL チュートリアル

1. まず、MySQL の公式サイトから最新バージョンの MySQL をダウンロードします。リンクを...

Vueの子コンポーネントと親コンポーネントの詳細な分析

目次1. 親コンポーネントと子コンポーネント2. テンプレート分離書き込み1. テンプレートタグ2....

CSS グリッドレイアウトを使用してレスポンシブな縦棒グラフを作成する方法

私はしばらくの間チャートをいじっていましたが、好奇心から、CSS を使用してチャートを作成するより良...

CentOS 7へのJenkinsのインストール手順の詳細な説明

Yum経由でJenkinsをインストールする1. インストール # yum ソースをインポート wg...

フォームのデフォルトの送信方法を変更する方法

htmlのデフォルトの送信方法は、postではなくgetです。postに変更したい場合は、 meth...

MySQL主キー命名戦略関連

最近、データライフサイクル管理の詳細を整理していたときに、小さな問題を発見しました。それは、MySQ...