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

推薦する

Dockerはjenkins+mavenコード構築および展開プラットフォームを構築します

目次Docker の基本概念Docker インストール プロセス (Centos6.9)カーネルのア...

MySQLがbinlogファイルを手動で登録し、マスタースレーブ異常を引き起こす理由

1. 問題の原因友人の @水米田 から、POSITION に基づくマスタースレーブについて質問があり...

Vueカスタムカプセル化ボタンコンポーネント

Vueボタンコンポーネントのカスタムカプセル化コードは参考用です。具体的な内容は次のとおりです。ボタ...

絵文字と問題解決のためのMySQL/Javaサーバーサポートの詳細な説明

この記事では、絵文字用の MySQL Java サーバーのサポートと問題解決方法について説明します。...

HTML で div を非表示にする テーブルを非表示にする TABLE または DIV コンテンツの CSS スタイル

今夜、数日間悩まされていた問題を解決しました。本当に解決したかどうかはわかりませんが、解決されている...

仕事でよく使うLinuxコマンドまとめ

仕事では、docker や kubernetes などのオープンソース ツールをさらに活用しましょう...

nginxのデフォルトポートを変更する方法の詳細な説明

まず設定ファイルがどこにあるか調べる nginx.confはどこにありますかこれらのディレクトリを調...

DPlayer.js ビデオ再生プラグインの使い方

DPlayer.jsビデオプレーヤープラグインは使いやすい主な用途: ビデオの再生、監視の開始、終了...

JS での Reduce() メソッドの使用の概要

目次1. 文法2. 例3. その他の関連方法長い間、reduce() メソッドの具体的な使い方を理解...

Vue2.x プロジェクトのパフォーマンス最適化のためのコード最適化の実装

目次1 v-ifとv-showの使用2. 計算と監視を区別する3 v-for トラバーサルでは、アイ...

Manjaro インストール CUDA 実装チュートリアル分析

昨年末、Thinkpad T450 のデュアルシステムの opensuse を Manjaro に置...

UI を通じて Docker を管理する方法

Docker はますます多くのシナリオで使用されています。コマンドラインツールに慣れていない人にとっ...

VC6.0をWIN10にインストールすると使用できない問題の解決方法

VC6.0は確かに古すぎるVC6.0は昔の開発ツールです。現在のwin10では対応していません。しか...

Linux ソースコードからのソケット (TCP) クライアント側での接続の例の詳細な説明

序文著者は、アプリケーションからフレームワーク、オペレーティング システムに至るまで、あらゆるコード...

mysql8.0.19 の基本データ型の詳細な説明

MySQL 基本データ型一般的な MySQL データ型の概要 ![1036857-201708011...