MySQLの制限を使用して大規模なページングの問題を解決する方法

MySQLの制限を使用して大規模なページングの問題を解決する方法

序文

日常の開発では、MySQL を使用してページングを実装する場合、常に MySQL 制限構文を使用します。ただし、その使用方法は非常に特殊なので、今日はそれをまとめてみましょう。

制限構文

limit 構文は、offset と limit の 2 つのパラメータをサポートします。前者はオフセットを示し、後者は最初の limit データを取得することを示します。

例えば:

## 条件を満たす最初の10個のステートメントを返す select * from user limit 10

## 条件を満たす11番目から20番目のデータを返す select * from user limit 10,20

上記から、限界 n は限界 0,n と同等であることもわかります。

パフォーマンス分析

実際の使用では、ページングの後ろにある一部のページの読み込みが遅くなることがわかります。つまり、次のようになります。

ユーザー制限 1000000,10 から * を選択

ステートメントの実行は遅いです。まずはテストしてみましょう。

まず、小さなオフセットで 100 個のデータを取得します (データの総量は約 200 個)。その後、オフセットを徐々に増やします。

select * from user limit 0,100 ---------時間消費 0.03秒
select * from user limit 10000,100 ---------時間消費 0.05秒
select * from user limit 100000,100 ---------時間消費 0.13秒
select * from user limit 500000,100 ---------時間消費 0.23秒
select * from user limit 1000000,100 ---------時間消費 0.50秒
select * from user limit 1800000,100 ---------時間消費 0.98秒

オフセットが増加するにつれて、パフォーマンスがどんどん悪化していくことがわかります。

なぜでしょうか? limit 10000,10 の構文は、実際には MySQL がデータの最初の 10010 行を見つけ、最初の 10000 行を破棄することを意味しているためです。このステップは実際には無駄です。

最適化

IDで最適化

まず、最後のページングの最大 ID を見つけ、次に、select * from user where id>1000000 limit 100 と同様に、ID のインデックスを使用してクエリを実行します。
これは主キーがインデックス化されるため非常に効率的ですが、ID が連続している必要があり、where ステートメントによってデータがフィルター処理されるためクエリに where ステートメントを含めることができないという欠点があります。

カバーインデックスによる最適化

MySQL クエリがインデックスに完全にヒットすると、カバーリング インデックスと呼ばれます。これは、クエリがインデックスを検索するだけで済み、データを取得するためにデータ テーブルに戻ることなく直接戻ることができるため、非常に高速です。したがって、最初にインデックス ID を見つけてから、その ID に基づいてデータを取得できます。

select * from (select id from job limit 1000000,100) a left join job b on a.id = b.id;

これには0.2秒かかりました。

要約する

確かに、MySQL を使用して大量のデータをページ分割するのは困難ですが、最適化する方法はいくつかあり、ビジネス シナリオと組み合わせてさらにテストを行う必要があります。
ユーザーが 10,000 ページに移動したときに、空を返さないのはなぜですか? それはそんなに退屈ですか?

さて、今回の記事は以上です。この記事の内容が皆さんの勉強や仕事に少しでも参考になれば幸いです。123WORDPRESS.COM をよろしくお願いいたします。

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

<<:  Linux bash: ./xxx: バイナリ ファイルを実行できません エラー

>>:  Reactでaxiosを使用してリクエストを送信する一般的な方法

推薦する

JavaScript でオブジェクトのプロパティを削除する方法

1. 削除delete は、オブジェクトのプロパティを残さずに削除する唯一の方法ですが、その「代替」...

MySql データベース クエリの特殊コマンド

まずMySQLのインストールMySQLソフトウェアをダウンロードし、インストールパスを変更しますMy...

CentOS 7.3 で Nginx 仮想ホストを設定する方法

実験環境最小限にインストールされた CentOS 7.3 仮想マシン基本環境を構成する1. ngin...

VirtualBox を使用して Mac 上にローカル仮想マシン環境を構築する方法

1. ビッグデータとHadoopビッグデータについて研究し学ぶには、当然 Hadoop から始める必...

Vueはシンプルな計算機能を実装します

この記事では、参考までに、Vue の具体的なコードで簡単な計算機を実装する方法を紹介します。具体的な...

HTML テーブル タグ チュートリアル (36): テーブル ヘッダーの背景色属性 BGCOLOR

<TH> タグは、テーブル内のヘッダーのプロパティを設定するために使用されます。以下の...

ReactとAntdのFormコンポーネントを組み合わせてログイン機能を実装する方法を詳しく説明します

目次1. ReactとAntdを組み合わせてログイン機能を実現2. ReactとAntdを組み合わせ...

1 つの記事で Vuex を理解する

目次概要Vuex の 4 つの主要オブジェクト状態の使用突然変異の使用ゲッターの使用アクションの使用...

MySQL 5.7 インストール MySQL サービスを開始できませんが、サービスはエラーを報告しません

MySQL 5.7 をインストールするには 2 つの方法があります。1 つはインストーラをダウンロー...

docker で mysql に接続できない場合の解決策

シナリオ: 仮想マシンの Docker コンテナに最新バージョンの MySQL をインストールした後...

SQL Server データベース エラー 5123 の解決方法

なぜなら、SQL Server 2005 に基づくデータベース チュートリアルがあり、そこで使用され...

MySQL データベースは XA 仕様をどのように実装しますか?

MySQL 一貫性ログMySQL データベースの電源が切れた場合、コミットされていないトランザクシ...

複数の X 軸を使用して 7 日間の天気予報を実現するための Echarts サンプル コード

目次UIデザインEcharts の例の効果序文サンプルコード最終結果UIデザイン Echarts の...

Linux の PHP に XML 拡張機能をインストールする詳細な手順

PHP Linux に XML 拡張機能をインストールする1. PHPインストールソースパッケージを...