MySQL Limitパフォーマンス最適化とページングデータパフォーマンス最適化の詳細な説明

MySQL Limitパフォーマンス最適化とページングデータパフォーマンス最適化の詳細な説明

MySQL Limit はセグメント内のデータベース データをクエリでき、主にページングで使用されます。最近作成されたウェブサイトのデータは数千に上りますが、いくつかの小さな最適化は大きな役割を果たしません。開発は極限まで行われ、完璧なパフォーマンスを追求する必要があります。以下に、パフォーマンスを最適化するためのいくつかの制限方法を示します。

制限構文:

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

LIMIT 句を使用すると、SELECT ステートメントで指定された数のレコードを返すように強制できます。 LIMIT は 1 つまたは 2 つの数値引数を受け入れます。引数は整数定数でなければなりません。

2 つの引数が指定された場合、最初の引数は返される最初の行のオフセットを指定し、2 番目の引数は返される行の最大数を指定します。最初のレコード行のオフセットは 0 (1 ではない) です。

サポート制限 # オフセット # 構文:

mysql> SELECT * FROM table LIMIT 5,10; // 6-15行目を取得
//特定のオフセットからレコードセットの最後までのすべての行を取得するには、2番目のパラメータを-1に指定します。
mysql> SELECT * FROM table LIMIT 95,-1; // 96行目から最後の行までを取得
//パラメータが1つだけ指定されている場合は、返される行の最大数を示します。つまり、LIMIT nはLIMIT 0,nと同じです。
mysql> SELECT * FROM table LIMIT 5; // 最初の5行を取得します

limit n,m は、n 番目のレコードから始まる m 個のレコードを選択することを意味します。ほとんどの開発者は、Web における従来のページング問題を解決するために、このタイプのステートメントを使用することを好みます。データセットが小さい場合、これは大きな問題ではありません。非常に大量のデータを持つ可能性のあるフォーラムなどのアプリケーションの場合、制限 n,m の効率は非常に低くなります。毎回データを選択する必要があるためです。最初の 5 つのレコードだけを選択する場合は、非常に簡単で便利ですが、100 万件のレコードの場合、800,000 行目から 5 つのレコードを選択すると、この位置までレコードをスキャンする必要があります。

つまり、limit 10000,20 は、条件を満たす 10020 行をスキャンし、最初の 10000 行を破棄し、最後の 20 行を返すことを意味します。問題はここにあります。limit 100000,100 を使用すると、100100 行をスキャンする必要があります。同時実行性の高いアプリケーションでは、各クエリで 100,000 行以上をスキャンする必要があり、パフォーマンスは間違いなく大幅に低下します。

異なるデータ量によるデータ読み取り効率の比較:

1. オフセットが小さい場合:

テーブル制限5,10から*を選択

複数回実行した後、時間は0.0004〜0.0005の間のままでした。

テーブルから*を選択、ID >=( 
テーブルからIDを選択 ID制限10,1で並べ替え 
) 制限 10

複数回実行した後も、時間は 0.0005 ~ 0.0006 の間のままでした。したがって、オフセットが小さい場合は、limit を直接使用する方が効率的です。

2. オフセットデータが大きい場合:

テーブル制限10000,10から*を選択

複数回実行した後も、時間は 0.0187 秒前後のままでした。

テーブルから*を選択、ID>=( 
テーブルからIDを選択 ID制限10000,1で並べ替え 
) 制限 10

複数回実行した後も、時間は 0.061 秒程度で、以前の約 1/3 のままでした。したがって、オフセットが大きい場合、後者を使用すると効率が低下します。これは id をインデックスとして使用した結果です。

id がデータ テーブルの主キーとして使用されている場合:

テーブル制限 10000,10 から ID を選択

クエリには約 0.04 秒かかります。これは、id 主キーがインデックスとして使用されるためです。

パフォーマンスの最適化を制限する:

ID>=( のサイクロペディアから * を選択 
最大(ID)を選択( 
サイクロペディアからIDを選択 ID制限90001で並べ替え 
) tmpとして 
) 制限 100; 
ID>=( のサイクロペディアから * を選択 
最大(ID)を選択( 
サイクロペディアからIDを選択 ID制限で並べ替え 90000,1 
) tmpとして 
) 制限 100;

2 番目の文は、90,000 件のレコードから最後の 100 件のレコードを取得するときに高速になります。最初の文では、まず最初の 90,001 件のレコードを取得し、最大の ID 値を開始識別子として取得し、それを使用して次の 100 件のレコードをすばやく検索します。一方、2 番目の文では、最後のレコードのみを取得し、その ID 値を開始識別子として取得し、次の 100 件のレコードを検索します。 2 番目の文は次のように短縮できます。

ID>=( のサイクロペディアから * を選択 
IDを選択( 
サイクロペディアからIDを選択 ID制限で並べ替え 90000,1 
) tmpとして 
) 制限 100;

最大演算は省略され、ID は通常は増分されます。

ページングデータのパフォーマンス最適化:

1. 大量のデータを含むデータ テーブルの場合、主キーとインデックス フィールドを作成してインデックス テーブルを作成し、インデックス テーブルを通じて対応する主キーをクエリし、次に主キーを通じて大量のデータを含むデータ テーブルをクエリすることができます。

2. where 条件があり、インデックスを使用して limit を使用する場合は、インデックスを設計し、where を最初に配置し、limit に使用する主キーを 2 番目に配置し、主キーのみを選択する必要があります。これにより、読書速度が向上します

3. 使用方法: まず、where 条件を通じて対応する主キー値を取得し、次に主キー値を使用して対応するフィールド値を照会します。

カーソルを使用したページング:

MySQL で最高のクエリ パフォーマンスを実現するために、ページング クエリをカーソル クエリ モードに変更しました。

テーブルから * を選択し、 id > last_id の制限が 20 で、 reply_id ASC で並べ替えます。

上記の last_id はこのページの最後のレコードの ID であるため、「次のページ」クエリを実現でき、同様に「前のページ」クエリも実現できます。

カーソル ページングは​​、連続データにのみ適しており、ページ ジャンプはサポートされていません。自動増分 ID を作成するか、データ テーブルに順序付けされたフィールドを追加することができます。大量のデータがあるプロジェクトの場合、ページ ジャンプはあまり役に立ちません。検索の目的を達成するには、フィルター条件を使用できます。

要約する

以上がこの記事の全内容です。この記事の内容が皆様の勉強や仕事に何らかの参考学習価値をもたらすことを願います。123WORDPRESS.COM をご愛顧いただき、誠にありがとうございます。これについてもっと知りたい場合は、次のリンクをご覧ください。

以下もご興味があるかもしれません:
  • MySQL クエリの最適化: LIMIT 1 はテーブル全体のスキャンを回避し、クエリの効率を向上させます
  • 制限を使用すると、MySQL のページングがどんどん遅くなるのはなぜですか?
  • MySQL 最適化 query_cache_limit パラメータの説明
  • MySQLのorder byとlimitを混在させる際の落とし穴の詳細な説明
  • MySQL ページングの制限パラメータの簡単な例
  • 大きなオフセットによる MySQL 制限ページングが遅い理由と最適化ソリューション
  • MySQL のソートとページング (order by と limit) と既存の落とし穴
  • MySQLの制限を使用して大規模なページングの問題を解決する方法
  • MySQL における制限関数と合計関数の混在使用の問題の詳細な説明
  • MySQL Limitクエリのパフォーマンスを向上させる方法
  • MySQL の制限ページング最適化ソリューションの実装に関する簡単な説明
  • MySQL のクエリパフォーマンスに対する制限の影響

<<:  vue3 で vue-router を使用するための完全な手順

>>:  Dockerはホスト間のネットワーク通信を実現するためにMacvlanを導入する

推薦する

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

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

Docker CPU 制限の実装

1. --cpu=<値> 1) コンテナが使用できるCPUリソースの量を指定しますが、コ...

Vue3 の動的コンポーネントはどのように機能しますか?

目次1. コンポーネントの登録1.1 グローバル登録1.2 グローバルコンポーネントの登録プロセス1...

ウェブサイトはいつ広告を掲載すべきでしょうか?

最近、インターネットのベテランと「広告」について議論したのですが、彼から非常に興味深い意見を聞きまし...

MySQL マスタースレーブレプリケーションと読み取り書き込み分離の詳細な説明

記事マインドマップマスター/スレーブ レプリケーションと読み取り/書き込み分離を使用する理由は何です...

VantフレームワークをWeChatアプレットに導入するプロセス全体の記録

序文WeChat ミニプログラムのネイティブ UI が少し物足りないと感じることがあるので、サードパ...

シンプルなHTMLとCSSの使い方の詳細な説明

HTML と CSS を含む JD.com のホームページの静的ページ効果を 3 日間で完成させます...

IIS7 IIS8 リバースプロキシルールの記述、インストール、構成方法

目的: ステーションAをステーションBのセカンダリディレクトリとして扱うのように: http://w...

Ubuntu 20.04 オペレーティング システムの VMware インストール チュートリアル図

メモ: とにかく体験してみましょう。記録: NO.209この例の環境:仮想マシン: vmwareオペ...

Vue 折りたたみ表示の複数行テキスト コンポーネントの実装コード

折りたたみ表示の複数行テキストコンポーネント複数行のテキスト コンポーネントを折りたたんで表示し、展...

MySQL 8.0.16 winx64 のインストールと設定方法のグラフィックチュートリアル (win10 の場合)

この記事では、MySQL 8.0.16 winx64のインストールと設定の具体的な方法を記載します。...

MySQL インデックスの失敗を引き起こす一般的な書き込み方法の概要

序文最近、古いプロジェクトから残ったいくつかの SQL 最適化の問題に対処するのに忙しくしています。...

Prometheusコンテナのデプロイメントのための実用的なソリューション

環境ホスト名IPアドレス仕えるプロメテウス192.168.237.137プロメテウス、グラファナノー...

CentOS7でPHPスケジュールタスクを実行する方法

序文この記事は主に CentOS7 で PHP スケジュールタスクを実行することに関する関連コンテン...