MySQLのページング制限のパフォーマンス問題についての簡単な説明

MySQLのページング制限のパフォーマンス問題についての簡単な説明

MySQL ページング クエリは通常、制限を通じて実装されます。 limit は 1 つまたは 2 つの整数パラメータを受け入れます。パラメータが 2 つの場合、最初のパラメータは返される最初のレコード行のオフセットを指定し、2 番目のパラメータは返されるレコード行の最大数を指定します。初期レコード行オフセットは 0 です。 PostgreSQL との互換性のため、limit は limit # offset # もサポートします。

質問:

オフセットが小さい場合は、limit を直接使用してクエリを実行しても問題ありません。ただし、データ量が増えると、limit ステートメントのオフセットが大きくなり、ページングが進むにつれて速度が大幅に低下します。

最適化のアイデア: データ量が多い場合は、レコードをスキャンしすぎないようにする

解決策: サブクエリ ページング メソッドまたは JOIN ページング メソッド。 JOIN ページングとサブクエリ ページングの効率は基本的に同じレベルであり、消費される時間も基本的に同じです。

ここに例があります。一般的に、MySQL の主キーは自動増分数値型です。この場合、最適化には次の方法が使用できます。

実際の運用環境で 60,000 件のレコードを含むテーブルを例に、最適化前後のクエリ時間を比較します。

-- 従来の制限、ファイルスキャン [SQL]
SELECT * FROM tableName ORDER BY id LIMIT 50000,2;
影響を受ける行: 0
時間: 0.171秒

-- サブクエリ方式、インデックススキャン [SQL]
テーブル名から * を選択
WHERE id >= (SELECT id FROM tableName ORDER BY id LIMIT 50000 , 1)
制限 2;
影響を受ける行: 0
時間: 0.035秒

-- JOIN ページングメソッド [SQL]
テーブル名からt1を選択する
JOIN (SELECT id FROM tableName ORDER BY id LIMIT 50000, 1) AS t2
t1.id <= t2.id の場合、t1.id によって LIMIT 2 が設定されます。
影響を受ける行: 0
時間: 0.036秒

最適化後、パフォーマンスが何倍も向上していることがわかります。

最適化の原則:

サブクエリはインデックスに対して実行され、通常のクエリはデータ ファイルに対して実行されます。一般的に、インデックス ファイルはデータ ファイルよりもはるかに小さいため、より効率的に操作できます。すべてのフィールドの内容を取得する必要があるため、最初の方法では多数のデータ ブロックにまたがって取得する必要がありますが、2 番目の方法では基本的にインデックス フィールドに従って検索した後、対応する内容を直接取得するため、当然ながら効率が大幅に向上します。したがって、制限を最適化するには、制限を直接使用するのではなく、まずオフセット ID を取得し、次に制限サイズを直接使用してデータを取得します。

実際のプロジェクトでは、同様の戦略パターンを使用してページングを処理できます。たとえば、1 ページあたり 100 件のレコードがある場合、ページ数が 100 未満の場合は最も基本的なページング方法が使用されますが、ページ数が 100 を超える場合はサブクエリ ページング方法が使用されます。

以上がこの記事の全内容です。皆様の勉強のお役に立てれば幸いです。また、123WORDPRESS.COM を応援していただければ幸いです。

以下もご興味があるかもしれません:
  • MySql ページングで limit+order by を使用する場合のデータ重複の解決策
  • 制限を使用すると、MySQL のページングがどんどん遅くなるのはなぜですか?
  • MySQL 最適化 query_cache_limit パラメータの説明
  • MySQLのorder byとlimitを混在させる際の落とし穴の詳細な説明
  • 大きなオフセットによる MySQL 制限ページングが遅い理由と最適化ソリューション
  • MySQL のソートとページング (order by と limit) と既存の落とし穴
  • MySQL は制限を使用してページング例メソッドを実装します
  • MySQLの制限を使用して大規模なページングの問題を解決する方法
  • MySQL の制限パフォーマンス分析と最適化
  • MySQL クエリにおける LIMIT の大きなオフセットによって引き起こされるパフォーマンス低下の分析
  • MySQL で制限を使用するとパフォーマンスに影響するのはなぜですか?

<<:  nginxワーカープロセスループの実装

>>:  Vue3とElectronを使ったデスクトップアプリケーションの詳しい説明

推薦する

MySQL ストアド プロシージャと共通関数のコード分析

mysql ストアド プロシージャの概念:特定のタスク (クエリと更新) を実行できる、データベース...

Linux で開いているファイルが多すぎる問題を解決する方法

原因は、プロセスが特定の時点でシステム制限を超える数のファイルと通信リンクを開くことです。 システム...

Flinkのフォールトトレラントメカニズムに関する簡単な説明:ジョブ実行とデーモン

目次1. ジョブ実行のフォールトトレランス1.1 タスクフェイルオーバー戦略1.2 ジョブ再開戦略2...

HTML の空リンク href="#" と href="javascript:void(0)" の違い

# には位置情報が含まれます。デフォルトのアンカーは #top で、これは Web ページの上部です...

vitrualBox+ubuntu16.04 python3.6 最新チュートリアルと詳細な手順のインストール

最近ディープラーニングを学ぶためにUbuntu+Python 3.6バージョンを使う必要があるため、...

Linux 環境に MySQL 8.0 をインストールするプロセスの紹介

目次序文1. Linux は yum ソースを変更します (MYSQL のインストールが遅い場合は試...

Vue 2つのフィールドの共同検証によりパスワード変更機能を実現

目次1. はじめに2. ソリューションの実装2.1 実装コード2.2 コードの説明2.3 検証結果1...

MySQL の基本: グループ化関数、集計関数、グループ化クエリの詳細な説明

目次1. 使い方が簡単2. DISTINCTを使用して重複を削除する3. COUNT()の詳細な紹介...

vue3 を使用したジグソーパズルゲームのリファクタリングの例

序文プロジェクト内のパズルゲーム(デジタル華容路とも呼ばれる)を再構築するのに 2 日かかりました。...

Vue.js ドロップダウン コンポーネント付きテキストボックス

ドロップダウン付きのテキストボックスを使用すると、ユーザーはドロップダウン リストから入力を選択した...

時間別にグループ化された MySQL クエリ ステートメント

年、月、週、日グループによる MySQL クエリ1. 学年別検索 SELECT DATE_FORMA...

Vue ページ監視ユーザープレビュー時間機能実装コード

最近のビジネスでは、オンライン トレーニング システムが特定のオンライン プレビュー ページに対する...

CSS3は、変換変形とイベントを組み合わせて扇形のナビゲーションを完成させます。

この場合、transition という単語を間違って書いたため、午後中ずっとそれに取り組みました。本...

Vueプロジェクトのパッケージ化の詳細な説明

目次1. 関連構成ケース1(使用ツールはvue-cil)ケース2(使用するツールはwebpack) ...

Windows Server 2012 でファイル サーバーを構築するための詳細な手順

ファイル サーバーは、企業内で最も一般的に使用されるサーバーの一つであり、主にファイル共有を提供する...