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

推薦する

Dockerに関するよくある質問

Docker はポートを IPv6 にのみマッピングし、IPv4 にはマッピングしません。 dock...

vue-router を遅延ロードする 3 つの方法のまとめ

遅延読み込みを使用しない 'vue' から Vue をインポートします。 '...

ウェブデザインにおけるポップアップウィンドウとフローティングレイヤーのデザイン

従来のソフトウェアから Web ウェアへの段階的な移行の傾向の中で、デザイン パターンとテクノロジは...

uniapp プロジェクトの最適化方法と提案

目次1. 複雑なページデータ領域をコンポーネントにカプセル化する2. 大きな画像の使用を避ける3. ...

プロジェクトにおけるVue3のロジック抽出とフィールド表示についての簡単な説明

目次論理階層化異なる地域から事業を分離するこれを実行する利点このようなシナリオにどう対処するか最適化...

MySQLのマスタースレーブ構成を使用して、読み取りと書き込みの分離を実現し、データベースの負荷を軽減します。

大規模な Web サイトでは、多数の同時アクセスを処理するために、Web サイト上の分散負荷分散以上...

CSS でよく発生する問題の整理 (ロゴのハッキング/コンテナの固定/画像の垂直方向の中央揃え)

1. IEブラウザモードハックロゴ1. CSSハックロゴコードをコピーコードは次のとおりです。 ie...

Navicat For MySQL の使い方に関する簡単なチュートリアル

推薦する: Navicat for MySQL 15 登録とアクティベーションの詳細なチュートリアル...

MySQL IDは1から増加し始め、不連続IDの問題を素早く解決します

mysql idは1から始まり、不連続なidの問題を解決するために自動的に増加します。強迫性障害の私...

Vuex環境の詳細な説明

目次Vuex環境を構築する要約するVuex環境を構築するsrcディレクトリにフォルダstoreを作成...

MySQL全文検索の使用例

目次1. 環境整備2. データの準備3. ショーを始める4. 単語分割エンジン要約する参考文献1. ...

JavaScript でツリー構造を構築するための効率的なアルゴリズムについての簡単な説明

目次導入アイデアID配列インデックスのマッピング関係を確立するツリー構造の構築原理要約する導入組織階...

CentOS7 systemdにカスタムシステムサービスを追加する方法

システムド: CentOS 7のサービスsystemctlスクリプトは、/usr/lib/syste...

Nginx リバース プロキシ springboot jar パッケージ プロセス分析

Springboot プロジェクトをサーバーにデプロイする方法としては、war パッケージにパッケー...

Dockerイメージの作成Dockerfileとコミット操作

イメージを構築するイメージを構築するには、主に 2 つの方法があります。実行中のコンテナをイメージに...