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

推薦する

Win10 + Ubuntu 16.04 デュアルシステム 完璧なインストールチュートリアル [詳細]

必ずデータをバックアップすることを忘れないでください。データは貴重なものです! ! !コンピュータモ...

OCSP を有効にすると、https 証明書の検証効率が向上し、Let's Encrypt SSL 証明書へのアクセスが遅くなる問題が解決されます。

ここ数日、ウェブサイトを初めて開いたときにアクセスが非常に遅いのですが、その後はページが正常に開きま...

Nodeはkoa2を使用してシンプルなJWT認証方式を実装します

JWT の紹介JWTとは正式名称はJSON Web Tokenで、現在最も人気のあるクロスドメイン認...

MySQL 8.0.13 のインストールと設定のグラフィックチュートリアル

Msyqlデータベースのインストール、参考までに具体的な内容は次のとおりです。 ①ブラウザでhttp...

React Native JSIはRNとネイティブ通信のサンプルコードを実装します

目次JSIとはJSIの違いiOS で JSI を使用するiOS 設定RN側の構成jsはパラメータ付き...

Nginx の http リソース リクエスト制限の詳細な説明 (3 つの方法)

前提条件: nginx には、ngx_http_limit_conn_module モジュールと n...

Macにmysql5.7.18をインストールする詳細な手順

1. ツール今必要なツールは2つあります: MySQLサーバー (mysql-5.7.18)、MyS...

VMwareがモジュールディスクを早期に開けない場合の解決策の詳細な説明

VMWare (Virtual Machine ware) は、「仮想 PC」ソフトウェア会社です。...

Linux jdk のインストールと環境変数の設定チュートリアル (jdk-8u144-linux-x64.tar.gz)

最初にsudo suコマンドを使用して root アカウントに切り替えることをお勧めします。そうしな...

ORM を使用して MySQL にデータを追加する手順

【序文】 ORM を使用してデータベース内のデータを操作する場合、前提として、新しい ORM モデル...

マークアップ言語 - リスト

標準化されたデザインソリューション - マークアップ言語とスタイルマニュアルWeb 標準ソリューショ...

MySQL DML ステートメントの概要

DML 操作とは、データベース内のテーブル レコードに対する操作を指し、主にテーブル レコードの挿入...

21 の MySQL 標準化および最適化のベスト プラクティス!

序文良い習慣はすべて宝物です。この記事は、SQL の後悔の治療法、SQL パフォーマンスの最適化、S...

30分でReact Hooksを包括的に理解できます

目次概要1. 使用状態1.1 3つの概念に関する質問1.2 例1.3 注記2. リデューサーを使用す...

Nginx で複数のドメイン名がドメインをまたいでアクセスできるようにマップを使用する方法

一般的なNginx構成ではクロスドメインが可能 サーバー{ 11111 を聞いてください。 serv...