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アプレットにナンバープレート入力機能を実装

推薦する

Dockerはローカルイメージをパッケージ化し、他のマシンに復元します

1. docker imagesを使用して、このマシン上のすべてのイメージファイルを表示します。 2...

WebデザイナーがRetinaディスプレイデバイス向けの画像を作成する方法

特記事項:この記事は、Chris Spooner の英語記事「Web デザイン用の Retina グ...

Linux ログ表示方法 6 つのまとめ

バックエンド プログラマーは、さまざまな場所で Linux を扱います。Linux ログの読み方がわ...

Quill エディタでカスタム HTML レコードを挿入する詳細な例

もう2020年です。飢えた人間は単純なテキストでは満足できなくなり、さまざまなスタイルの派手なテキス...

yum を使用して rpm と関連する依存関係をダウンロードして、docker をオフラインでインストールします。

yum を使用してすべての依存関係を一緒にインストールできますが、–downloadonly –d...

Tomcatの各ポートの機能の詳細な説明

tomcat 設定ファイルから、tomcat の起動時にデフォルトで 8080 (8443)、800...

完璧なアロエベラジェルを選ぶには?完璧なアロエベラジェルの本物と偽物の見分け方

最新のパーフェクト アロエ ベラ ジェルのパッケージ ボックスには、赤いフォントで完璧な英語の文字が...

Linux の sudo 脆弱性により不正な特権アクセスが発生する可能性がある

Linux で新たに発見された sudo の脆弱性を悪用すると、特定のユーザーが root としてコ...

MySQLとRedisキャッシュ間の同期ソリューションについての簡単な説明

目次1. ソリューション 1 (UDF)デモケース2. ソリューション2(binlogの解析)キャナ...

フローティング要素が親要素の高さを崩す原因と解決策の詳細な説明

フローティング要素は、親要素の高さを縮小します。要素を float float:left/right...

MySQL データベース分離レベルと MVCC の詳細な説明

目次1. 分離レベルコミットされていない読み取りREAD COMMITED (コミット読み取り/非反...

HTML テーブルタグチュートリアル (46): テーブルフッタータグ

<tfoot> タグは、テーブル フッターのスタイルを定義するために使用されます。基本構...

React リストバーとショッピングカートコンポーネントの使用の詳細な説明

この記事では、Reactリストバーとショッピングカートコンポーネントの具体的なコードを参考までに紹介...

VUE のコンパイル スコープとスロット スコープのスロットの問題について

スロットとは何ですか?スロット ディレクティブは v-slot であり、現在 slot と slot...

MySQL にテーブルが存在するかどうかを確認し、それを一括で削除する方法

1. インターネットで長時間検索しましたが、判定表が存在するかどうかがわからなかったので、漠然と削除...