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を導入する

推薦する

sysbenchツールによるMySQLデータベースのパフォーマンステストの実装方法

1. 背景Sysbench は、システムのハードウェア パフォーマンスをテストできるストレス テスト...

Linux での NVIDIA GPU 使用状況の監視の詳細な説明

TensorFlow をディープラーニングに使うとビデオメモリ不足がよく起こるので、GPU 使用状況...

Springboot アプリケーションを迅速にデプロイするために Docker とアイデアを統合する詳細なプロセス

目次1. はじめに2. 環境とツール3. Dockerをインストールし、リモート接続を構成する4. ...

VMware 仮想マシンのインストール win7 オペレーティング システム チュートリアル ダイアグラム

VMwareaのインストールプロセスは説明しませんが、主にwin7イメージをロードする方法を説明しま...

DockerがMySQL構成実装プロセスを開始

目次実際の戦闘プロセスまずは主なコマンドと詳細を一つずつ説明しましょう起動が成功したかどうかを確認す...

JavaScript データ型変換の例 (他の型を文字列、数値型、ブール型に変換する)

序文データ型変換とは何ですか?フォームまたはプロンプトを使用して取得されるデフォルトのデータ型は文字...

MySQL binlog の解析

目次1. binlogの紹介2. Binlog関連のパラメータ3. バイナリログの内容を分析するIV...

2019 年に最も役立ち重要なオープンソース ツール トップ 10

Black Duck の 2017 年のオープンソース調査では、回答者の 77% がオープンソース...

Linux calコマンドの使用

1. コマンドの紹介cal (カレンダー) コマンドは、現在の日付または指定された日付のグレゴリオ暦...

インスタンス化されたオブジェクトパラメータによるMySQLクエリ例の説明

この記事では、オブジェクト パラメータをインスタンス化して MySQL でデータをクエリする方法を紹...

Apache ab同時負荷ストレステストの実装方法

腹筋コマンドの原則Apache の ab コマンドは、マルチスレッドの同時リクエストをシミュレートし...

ウェブページ内の 2 つのボックス モデル (W3C ボックス モデル、IE ボックス モデル)

Web ページ ボックス モデルには 2 種類あります。 1: 標準 W3C ボックス モデル。2:...

Linux で測位バックグラウンド サービスが時々クラッシュする問題の解決方法

問題の説明最近のバックグラウンドサービスでは、特定の命令の要求データをディスクに保存する新しい機能が...

Dockerfile 内の予約語命令の解析処理

目次1. Dockerfile とは何ですか? 2. Dockerfile構築プロセスの分析3. D...

CSS 動的読み込みバー効果のサンプルコード

CSS変数の知識を使って、追加したコードとコメントを直接投稿します <!DOCTYPE htm...