数千万のデータを扱うMySQLのページングクエリのパフォーマンスを最適化する

数千万のデータを扱うMySQLのページングクエリのパフォーマンスを最適化する

MySQL のデータ量が多い場合、制限ページングが使用されます。ページ数が増えると、クエリの効率が低下します。

実験

1. limit start、count paging ステートメントを直接使用します。

select * from order limit start, count

開始ページが小さい場合、クエリのパフォーマンスの問題はありません。次のように、10、100、1000、10000 (ページあたり 20 レコード) からのページングの実行時間を見てみましょう。

注文制限 10、20 から * を選択 0.016 秒 注文制限 100、20 から * を選択 0.016 秒 注文制限 1000、20 から * を選択 0.047 秒 注文制限 10000、20 から * を選択 0.094 秒

開始レコードの数が増えると、時間も長くなることがわかりました。これは、ページング ステートメントの制限が開始ページ番号と密接に関係していることを示しています。では、開始レコードを 40w に変更して確認してみましょう。

select * from order limit 400000, 20 3.229秒

最後の記録ページを撮った時間を見てみましょう。

select * from order limit 800000, 20 37.44秒

明らかにこの時間は耐え難いものです。

このことから、次の 2 つのことが分かります。

1) 制限ステートメントのクエリ時間は開始レコードの位置に比例します。

2) MySQL の limit ステートメントは非常に便利ですが、レコード数が多いテーブルに直接使用するには適していません。

2. 制限ページング問題に対するパフォーマンス最適化手法

テーブルのカバーインデックスを使用してページングクエリを高速化する

インデックス クエリを使用するステートメントにそのインデックス列 (カバー インデックス) のみが含まれている場合、クエリが非常に高速になることは誰もが知っています。

インデックス検索には最適化されたアルゴリズムがあり、データはクエリ インデックス上にあるため、関連するデータ アドレスを探す必要がなくなり、時間を大幅に節約できます。また、MySQL には関連するインデックス キャッシュもあり、同時実行性が高い場合にキャッシュを使用すると効果が高まります。

この例では、id フィールドが主キーであることがわかっているため、デフォルトの主キー インデックスが含まれます。次に、カバーリング インデックスを使用したクエリがどのように実行されるかを見てみましょう。

今回は、次のように、最後のページのデータをクエリします (id 列のみを含むカバー インデックスを使用)。

select id from order limit 800000, 20 0.2秒

すべての列をクエリするのにかかる 37.44 秒と比較すると、速度は 100 倍以上向上します。

すべての列をクエリする場合、2 つの方法があります。1 つは id>= 形式、もう 1 つは結合を使用する方法です。実際の状況を確認してください。

SELECT * FROM order WHERE ID > =(select id from order limit 800000, 1) limit 20

クエリ時間は0.2秒で、これは質的な飛躍です(笑)

別の書き方

SELECT * FROM order a JOIN (select id from order limit 800000, 20) b ON a.ID = b.id

クエリ時間も非常に短い

以下もご興味があるかもしれません:
  • MySQL ページングクエリ最適化テクニック
  • MySQL 最適化チュートリアル: 大規模なページングクエリ
  • 数百万のデータボリュームに対する MySQL ページングクエリ方法とその最適化の提案
  • MySQL 百万レベルのデータページングクエリ最適化ソリューション
  • Mysql 制限ページングクエリ最適化の詳細な説明
  • 数百万のデータに対するMySQLラージページクエリ最適化の実装

<<:  Vueモバイル端末の適応化問題の詳細説明

>>:  Linux におけるシステム入出力管理の詳細な説明

推薦する

CentOS7 で Jenkins+Maven+Git 継続的インテグレーション環境を構築する方法

この記事では、Spring boot + Maven プロジェクトのデプロイメントを例に、Code ...

WeChatミニプログラム公式顔認証の詳しい説明

ミニプログラムはユーザーの個人情報を収集してアップロードしましたが、拒否されました。こんにちは、ミニ...

Vue コンポーネントはどのように解析され、レンダリングされるのでしょうか?

序文この記事では、Vue コンポーネントがどのように解析され、レンダリングされるかを説明します。 V...

Vue Element Sortablejs を使用してテーブル列をドラッグする詳細な説明

1. css: ドラッグテーブル.css @charset "UTF-8"; ....

Windows Server 2008R2、2012、2016、2019 の違い

目次共通バージョンの紹介共通バージョンのダウンロードアドレスとインストール以下に簡単な違いを示します...

Nginx で何ができるかの包括的な分析

序文この記事は、サードパーティのモジュールをロードせずにNginxで処理できることのみに焦点を当てて...

Centos サーバーで nginx を設定する方法の例

セキュアターミナルMobaXterm_Personalをダウンロードまず、安全なターミナルをダウンロ...

CentOS7でFTPサーバーを設定する方法

FTP は主にファイル転送に使用され、Linux では vsftpd で実装されるのが一般的です。F...

Tomcat をサービスとして登録する際に注意すべき点のまとめ

Tomcat をサービスとして登録する場合の注意点は次のとおりです。 インターフェースを開いたら、以...

Linuxの運用・保守の基礎知識から上級者向け知識までをまとめました

運用保守エンジニアは、初期段階では非常に大変な仕事です。この期間中、コンピューターの修理、ネットワー...

Dockerでデータディレクトリを移行する方法

目次ディスク使用量の表示ディスク クリーンアップ (軽々しく使用しないでください)データの移行ディス...

CSSは、マウスを線の上に置くと線全体の色を変える効果を実現します。

まとめ:以下のように、CSS で指定した行にマウスを置いたときに行全体の色を変更する方法を示します。...

Vue/React シングルページ アプリケーションをリフレッシュなしで復元するソリューション

目次導入なぜわざわざ?落とし穴のあるコミュニティソリューション(Vue を例に挙げる)現時点では良い...

Nginx 環境での WordPress マルチサイト構成の詳細な説明

WordPress のマルチサイト機能を使用すると、1 つの WordPress プログラムをインス...

Linuxファイルを表示するコマンドの詳細な説明

Linuxファイルを表示する方法ファイルの内容を表示するコマンド: catは最初の行からコンテンツを...