MySQL クエリにおける LIMIT の大きなオフセットによって引き起こされるパフォーマンス低下の分析

MySQL クエリにおける LIMIT の大きなオフセットによって引き起こされるパフォーマンス低下の分析

序文

MySQLクエリはselectコマンドを使用し、limitとoffsetパラメータを使用して、指定された範囲のレコードを読み取ることができることは誰もが知っています。ただし、オフセットが大きすぎる理由は、クエリのパフォーマンスと最適化方法に影響します。

ビジネス システムではページングが必然的に必要になります。ページングを考えるとき、それを実装するために SQL で LIMIT を使用することを間違いなく考えるでしょう。ただし、LIMIT を誤って使用すると、パフォーマンスの問題 (SQL の実行が遅くなり、サーバーがダウンする可能性がある) が発生し、上司から批判される可能性があります。そのため、LIMIT を正しく使用する方法を確認しましょう。

詳しい紹介を見てみましょう。

ページングを実装するためのLIMIT OFFSET、ROW_COUNT

パフォーマンスの問題が発生する原因

myTable から * を選択し、`id` で LIMIT 1000000, 30 で並べ替えます。

この SQL 文を書いた人は、MySQL データベースが条件を満たす 1,000,000 番目の数字を直接見つけ、30 個のデータを取得するだろうと考えたに違いありません。
しかし、これは MySQL が実際に動作する方法ではありません。

LIMIT 1000000, 30 は、条件を満たす 1000030 行をスキャンし、最初の 1000000 行を破棄し、最後の 30 行を返すことを意味します。

より良い方法

t.*を選択
から (
  選択ID
  myTableから
  注文する
    id
  制限 1000000, 30
  ) q
myTable t に参加する
オン t.id = q.id

一般的な原則は次のとおりです。

  • サブクエリはインデックス列のみを使用し、実際のデータを取得しないため、ディスク IO は発生しません。そのため、オフセットが比較的大きい場合でも、クエリ速度が遅くなりすぎることはありません。

具体的な原理分析に興味のある方は、この記事をお読みください: MySQL ORDER BY / LIMIT パフォーマンス: 遅延行検索

追記

つづく。

参考文献

  • MYSQL の LIMIT オフセットが高くなると、なぜクエリの速度が低下するのでしょうか?
  • MySQL ORDER BY / LIMIT パフォーマンス: 遅い行の検索

要約する

上記はこの記事の全内容です。この記事の内容が皆さんの勉強や仕事に一定の参考学習価値を持つことを願っています。ご質問があれば、メッセージを残してコミュニケーションしてください。123WORDPRESS.COM を応援していただきありがとうございます。

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

<<:  Zabbix で Windows のパフォーマンスを監視する方法

>>:  jQueryのチェーンプログラミングスタイルの詳細な例

推薦する

Dockerfile における VOLUME と docker -v の違い

Dockerfile でのボリュームのマウントと docker -v コマンドによるマウントには明ら...

ブラウザは関連するHTTPヘッダーをキャッシュし、HTTPリクエストの数を最小限に抑えます。

最近、Yahoo の 34 の黄金律を読み、ウェブサイトのパフォーマンスを最適化する方法を学びました...

ジョセフリング問題を解決する 3 つの JavaScript メソッド

目次概要問題の説明循環リンクリスト順序付き配列数学的再帰要約する概要ジョセフ・リング問題は、ジョセフ...

CSSは下部のタップバー機能を実装します

現在多くの携帯電話には、下部のタブバーを切り替える機能があります。私も最近、同様の機能を見つけました...

フロントエンドセキュリティの詳細な説明: JavaScript の http ハイジャック対策と XSS

目次HTTP ハイジャック、DNS ハイジャック、XSS HTTPハイジャックDNSハイジャックXS...

JS は複数のタブを切り替えるカルーセルを実装します

カルーセルアニメーションは、ページの外観とインタラクティブなパフォーマンスを向上させることができます...

MySQL監視グループレプリケーションについて簡単に説明します

元のテキスト: https://dev.mysql.com/doc/refman/8.0/en/gr...

カルーセル効果を作成するためのjs

カルーセルはフロントエンド開発において比較的重要なポイントだと思います。ネイティブjsの知識ポイント...

dl、dt、dd はいつ使用するのが適切ですか?

dl:定義一覧定義リストdt:定義タイトルタイトルを定義するdd:定義説明定義の説明dt は情報のタ...

Tomcat および Web アプリケーションの Docker デプロイメントの実装

1.dockerをオンラインでダウンロードする yum インストール -y epel-release...

Centos7 システムでの .NET Core 2.0 + Nginx + Supervisor 環境の構築

1. Linux .NET Core の紹介Microsoft は常に自社のプラットフォームに対して...

MySql で SQL 実行プランをクエリするために explain を使用する方法

explain コマンドは、クエリ オプティマイザーがクエリの実行を決定した方法を確認する主な方法で...

React プロジェクトで eslint の Baidu スタイルを使用する詳細な説明

1. Baidu Eslint Ruleプラグインをインストールする npm i -D eslint...

SpringbootはDockerデプロイメントを統合し、Dockerイメージを構築する2つの方法を実装します。

Docker は、あらゆるアプリケーション用の軽量でポータブルな自己完結型コンテナーを簡単に作成で...

CSS3のボックスサイズプロパティの興味深いボックスモデルについての簡単な説明

誰もがボックス モデルの構成を、内側から外側まで、コンテンツ、パディング、境界線、マージンについて知...