MySQL ページング制限の実用的な最適化

MySQL ページング制限の実用的な最適化

序文

クエリ ステートメントを使用する場合、多くの場合、データの最初の数行または中間行を返す必要があります。このとき、何をすればよいでしょうか。心配しないでください。MySQL はすでにそのような機能を提供しています。

SELECT * FROM テーブル LIMIT [オフセット,] 行 | 行 OFFSET オフセット

LIMIT 句を使用すると、SELECT ステートメントで指定された数のレコードを返すように強制できます。 LIMIT は 1 つまたは 2 つの数値引数を受け入れます。引数は整数定数でなければなりません。 2 つの引数が指定された場合、最初の引数は返される最初の行のオフセットを指定し、2 番目の引数は返される行の最大数を指定します。初期行オフセットは 0 (1 ではありません) です。PostgreSQL との互換性のため、MySQL は LIMIT # OFFSET # という構文もサポートしています。

したがって、通常、データをクエリするときには制限ページングを使用します。これにより、テーブル全体のクエリが回避され、クエリの効率が向上します。ただし、テーブル内のデータ量が増えると、ページングクエリは遅くなります。以下で詳細な紹介を見てみましょう。

MySQL ページング制限の最適化

2,000 万件のデータを含むテスト テーブル カードを作成する

mysql> カードから count(*) を選択します。
+----------+
| カウント(*) |
+----------+
| 20000000 |
+----------+
セット内の 1 行 (0.00 秒)

-まず最初の1000行のクエリ速度をテストします

mysql> カード制限 1000,10 から * を選択します。
+---------+--------------------------------------+
| カードID | カード番号 |
+---------+--------------------------------------+
| 1001 | 13fc90a6-2e3b-11e8-ae62-9c5c8e6e37cf |
| 1002 | 13fc923e-2e3b-11e8-ae62-9c5c8e6e37cf |
| 1003 | 13fc93d5-2e3b-11e8-ae62-9c5c8e6e37cf |
| 1004 | 13fc956a-2e3b-11e8-ae62-9c5c8e6e37cf |
| 1005 | 13fc9702-2e3b-11e8-ae62-9c5c8e6e37cf |
| 1006 | 13fc9899-2e3b-11e8-ae62-9c5c8e6e37cf |
| 1007 | 13fc9a31-2e3b-11e8-ae62-9c5c8e6e37cf |
| 1008 | 13fc9bc6-2e3b-11e8-ae62-9c5c8e6e37cf |
| 1009 | 13fc9d5e-2e3b-11e8-ae62-9c5c8e6e37cf |
| 1010 | 13fc9ef5-2e3b-11e8-ae62-9c5c8e6e37cf |
+---------+--------------------------------------+
セット内の行数は 10 です (0.00 秒)

-100万回後にクエリをテストする

mysql> カード制限 1000000,10 から * を選択します。
+---------+--------------------------------------+
| カードID | カード番号 |
+---------+--------------------------------------+
| 1000001 | 2d87021a-2e3b-11e8-ae62-9c5c8e6e37cf |
| 1000002 | 2d8703ac-2e3b-11e8-ae62-9c5c8e6e37cf |
| 1000003 | 2d87053b-2e3b-11e8-ae62-9c5c8e6e37cf |
| 1000004 | 2d8706cd-2e3b-11e8-ae62-9c5c8e6e37cf |
| 1000005 | 2d87085f-2e3b-11e8-ae62-9c5c8e6e37cf |
| 1000006 | 2d8709f1-2e3b-11e8-ae62-9c5c8e6e37cf |
| 1000007 | 2d870b83-2e3b-11e8-ae62-9c5c8e6e37cf |
| 1000008 | 2d870d18-2e3b-11e8-ae62-9c5c8e6e37cf |
| 1000009 | 2d870eaa-2e3b-11e8-ae62-9c5c8e6e37cf |
| 1000010 | 2d871039-2e3b-11e8-ae62-9c5c8e6e37cf |
+---------+--------------------------------------+
10 行セット (0.18 秒)

-1000万回後にクエリをテストする

mysql> カード制限 10000000,10 から * を選択します。
+----------+--------------------------------------+
| カードID | カード番号 |
+----------+--------------------------------------+
| 10000001 | b11ad76c-2e49-11e8-ae62-9c5c8e6e37cf |
| 10000002 | b11aefd5-2e49-11e8-ae62-9c5c8e6e37cf |
| 10000003 | b11af868-2e49-11e8-ae62-9c5c8e6e37cf |
| 10000004 | b11b0031-2e49-11e8-ae62-9c5c8e6e37cf |
| 10000005 | b11b07ad-2e49-11e8-ae62-9c5c8e6e37cf |
| 10000006 | b11b0f0f-2e49-11e8-ae62-9c5c8e6e37cf |
| 10000007 | b11b1669-2e49-11e8-ae62-9c5c8e6e37cf |
| 10000008 | b11b1db2-2e49-11e8-ae62-9c5c8e6e37cf |
| 10000009 | b11b24fa-2e49-11e8-ae62-9c5c8e6e37cf |
| 10000010 | b11b2c37-2e49-11e8-ae62-9c5c8e6e37cf |
+----------+--------------------------------------+
10 行セット (1.29 秒)

時間が経つにつれてクエリの効率が低下することがわかります。 100 万個を超えるデータを照会する場合、MySQL は最初に 100 万個と 10 個のデータを照会し、次に次の 10 個のデータを傍受します。これらはパフォーマンスの低下を引き起こします。

では、100 万個のデータのスキャンを回避するにはどうすればよいでしょうか? 100 万以降の主キーが 100 万より大きいことが明確にわかります。そこで、インデックスを使用するようにSQLを書き直し、スキャンする行数を減らすことができます。

mysql> select * from card where card_id>=1000000 limit 10;
+---------+--------------------------------------+
| カードID | カード番号 |
+---------+--------------------------------------+
| 1000000 | 2d870088-2e3b-11e8-ae62-9c5c8e6e37cf |
| 1000001 | 2d87021a-2e3b-11e8-ae62-9c5c8e6e37cf |
| 1000002 | 2d8703ac-2e3b-11e8-ae62-9c5c8e6e37cf |
| 1000003 | 2d87053b-2e3b-11e8-ae62-9c5c8e6e37cf |
| 1000004 | 2d8706cd-2e3b-11e8-ae62-9c5c8e6e37cf |
| 1000005 | 2d87085f-2e3b-11e8-ae62-9c5c8e6e37cf |
| 1000006 | 2d8709f1-2e3b-11e8-ae62-9c5c8e6e37cf |
| 1000007 | 2d870b83-2e3b-11e8-ae62-9c5c8e6e37cf |
| 1000008 | 2d870d18-2e3b-11e8-ae62-9c5c8e6e37cf |
| 1000009 | 2d870eaa-2e3b-11e8-ae62-9c5c8e6e37cf |
+---------+--------------------------------------+
セット内の行数は 10 です (0.00 秒)

これにより、クエリの効率が大幅に向上します。

要約する

上記はこの記事の全内容です。この記事の内容が皆さんの勉強や仕事に一定の参考学習価値を持つことを願っています。ご質問があれば、メッセージを残してコミュニケーションしてください。123WORDPRESS.COM を応援していただきありがとうございます。

以下もご興味があるかもしれません:
  • MySQL のソートとページング (order by と limit) と既存の落とし穴
  • MySQL は制限を使用してページング例メソッドを実装します
  • MySQLの制限を使用して大規模なページングの問題を解決する方法
  • MySQLのページング制限のパフォーマンス問題についての簡単な説明
  • MySQL Limitパフォーマンス最適化とページングデータパフォーマンス最適化の詳細な説明
  • MySQL の制限ページング最適化ソリューションの実装に関する簡単な説明
  • MySQL の制限使用法とページングクエリステートメントのパフォーマンス分析の詳細な説明
  • mysql limit pagingの使い方と注意点
  • MYSQL ページング制限速度の最適化方法が遅すぎる
  • 大きなオフセットによる MySQL 制限ページングが遅い理由と最適化ソリューション

<<:  CentOS 7.x に ZSH ターミナルをインストールする方法

>>:  WeChatアプレットにナンバープレート入力機能を実装

推薦する

Vueでブラウザ共有機能を呼び出す方法

序文Vue(発音は /vjuː/、view に似ています)は、ユーザーインターフェイスを構築するため...

ページ内にマーキーとフラッシュが共存する場合の競合解決

競合の主な症状は、FLASH ボタンがジャンプし続け、不安定になり、Web ページの外観と通常のアク...

Vueは視覚的なドラッグページエディタを実装します

目次ドラッグアンドドロップの実装ドラッグイベントドラッグして開始リリースゾーンでの移動境界処理、角度...

MySQL インデックス プッシュダウン (ICP) の簡単な理解と例

序文Index Condition Pushdown (ICP) は、MySQL 5.6 の新機能で...

CSS 境界線の長さ制御機能の実装

以前は、境界線の長さをコンテナーよりも小さくする必要があったときに、div ネストを使用していました...

MySQL 8.0.11 圧縮版のインストールと設定方法のグラフィックチュートリアル

MySQL 8.0圧縮パッケージのインストール方法、詳細は次のとおりです知らせ:オペレーティング シ...

CentOS の MySQL に MariaDB をインストールするときに発生する方法と問題

以前にインストールしたmariadbを削除する1. rpm -qa | grep mariadb を...

理論の普及——ユーザーエクスペリエンス

1. 概念分析 1: UE ユーザー エクスペリエンス <br />英語ではユーザー エ...

mysql 計算関数の詳細

目次2. フィールドの連結2. MySQL関数の例をいくつか挙げてください。 2.1 シンボル処理2...

Vue で円形プログレスバーを実装する例

データ表示は、常にあらゆる職業の人々が求めているものです。特にフロントエンド開発業界では、データを表...

JavaScript イベントバブリング、イベントキャプチャ、イベント委任の詳細な説明

1. イベントバブリング: JavaScript イベント伝播のプロセスでは、要素でイベントがトリガ...

VMwareでCentOSがインターネットにアクセスできない問題を素早く解決

昨日、VMware に CentOS7 をインストールしました。Tomcat パッケージを転送するた...

Vueは不規則なスクリーンショットを実装する

目次SVG による画像キャプチャCSS部分エフェクト画像表示ソースコードアドレスこれまで見てきたもの...

Linux システム Docker への ASP.NET Core アプリケーションのデプロイのプロセス分析

目次1. システム環境2. 運用プロセスと途中で遭遇した問題1. システム環境1. Tencent ...