MySQL ページングパフォーマンスの調査

MySQL ページングパフォーマンスの調査

一般的なページング方法:

1. エスカレーター方式

エスカレーター方式では通常、前のページ/次のページの 2 つのナビゲーション モードのみが提供されます。一部の製品では、前のページの機能すら提供されておらず、「続きを読む/さらに読む」方法のみが提供されています。さらに、自動的にさらに読み込むプルダウン方式もあり、技術的にはこれらはすべてエスカレーター方式として要約できます。
エスカレーター方式は、技術的な実装が比較的単純かつ効率的です。現在のページの最後の項目のオフセットに従って、1 ページ戻るだけで済みます。 SQLで書くと次のようになるかもしれません

LIST_TABLE から * を選択し、 id > offset_id LIMIT n を指定します。

1. エレベーター方式

データを取得するもう 1 つの方法は、製品内で 1、2、3...n などの正確なページめくりを提供することです。ユーザーはナビゲーションにページ数を直接入力することもできます。中国ではほとんどの場面でエレベーターが使用されていますが、エレベーターの技術的な導入コストは比較的高くなっています。

MySQL では、通常言及される b-tree は、ストレージ エンジン実装の b+tree を指します。

エレベータ方式では、ユーザーがページ n に移動するように指定しても、その場所を直接指定する方法がありません。代わりに、1 階から 1 つずつカウントし、count*page までスキャンしてから実際にデータを取得する必要があり、効率が低くなります。

従来のページング技術(エレベーター方式)

まず、フロントエンドはページングエンティティとクエリ条件を渡す必要があります

//ページングエンティティ structFinanceDcPage{
1:i32 pageSize, //ページ容量 2:i32 pageIndex, //現在のページインデックス}

次に、クエリの合計数をフロントエンドに返す必要があります。

my_table から COUNT(*) を選択し、 WHERE = y で ORDER BY id を実行します。

次に、指定されたページ数をフロントエンドに返します。

SELECT * FROM my_table WHEREx = y ORDER BY date_colLIMIT (pageIndex - 1) * pageSize, pageSize;

上記の 2 つの SQL ステートメントの結果は、フロントエンド ページング エンティティと単一ページの結果セットに返される必要があります。

//ページングエンティティ structFinanceDcPage{
1:i32 pageSize, //ページ容量 2:i32 pageIndex, //現在のページインデックス 3:i32 pageTotal, //ページ総数 4:i32 totalRecod, //レコード総数}

従来のクエリ方法では、pageIndex 値、つまり制限オフセットと num オフセットのみが各リクエストで変更されます。

たとえば、limit 0,10、limit 10,10、…、limit10000,10、などです。

上記の変更により、各クエリの実行時間にずれが生じます。オフセット値が大きいほど、必要な時間は長くなります。たとえば、limit10000,10 を使用した場合、必要な 10 個のデータ項目を取得するには、10010 個のデータ項目を読み取る必要があります。

最適化手法

従来の方法から、効率化の鍵はプログラムが大量の不必要なデータを走査することであることがわかっています。キーポイントを見つけたら、そこから始めます。

エレベーターを使用する必要がない場合は、エスカレーターを使用してパフォーマンスを向上させることができます。

しかし、ほとんどの場合、エレベーター フォームはユーザーのニーズをよりよく満たすことができるため、エレベーター フォームを最適化する他の方法を見つける必要があります。

従来の方法に基づく最適化

上記の最適化方法は、ユーザーのニーズを満たすのが困難であるか、実装が複雑すぎるため、データ量が数百万などの特に大きくない場合は、実際には上記の最適化方法を使用する必要はありません。

従来の方法で十分ですが、最適化する必要があるかもしれません。例えば:

OrderBy の最適化

pa_dc_flow から * を選択し、 subject_code で並べ替え、 DESC LIMIT 100000, 5 を指定します。

このステートメントは ORDER BY キーワードを使用するため、何をソートするかが非常に重要です。自動増分 ID をソートする場合、このステートメントを最適化する必要はありません。インデックスまたは非インデックスの場合は、最適化する必要があります。

まず、インデックスが付けられていることを確認する必要があります。そうしないと、非常に遅くなります。次に、インデックスであっても、自動インクリメント ID のように順序付けられていない場合は、次のステートメントのように書き直す必要があります。

pa_dc_flow から * を選択し、INNER JOIN を実行します (pa_dc_flow から id を選択し、subject_code で DESC LIMIT 100000, 5 で ORDER BY します)。A Spa_dc_flow_id USING (id);

以下は2つのSQL文のEXPLAINです。


図から、2 番目の SQL ではスキャンできるページ数が少なくなることがわかります。

実際、これには order by の最適化が含まれます。subject_code インデックスは最初の SQL ステートメントでは使用されません。代わりに subject_code を選択した場合は、インデックスが使用されます。以下は order by の最適化です。

order by の後のフィールドにインデックスを使用する場合は、where 条件のフィールドを含む複合インデックスを作成する必要があります。 !つまり、orcerby の後のフィールドをインデックスでソートする必要がある場合は、where 条件のフィールドを使用して複合インデックスを作成するか、[ここで複合インデックスを作成するときは、複合インデックスの列順序 (where フィールド、order by フィールド) に注意して、左端の列の原則を満たす必要があります。その理由は、order by フィールドが where クエリ条件でカウントされるためです。 ]、またはそれ自体が where 条件で参照される必要があります。

テーブル asubject_code はインデックスを持つ通常のフィールドであり、id は自動増分主キーです。

select * from a order by subject_code // インデックスは使用されません select id from a order by subject_code // インデックスを使用できます select subject_code from a order by subject_code // インデックスを使用できます select * from a where subject_code = XX order by subject_code // インデックスを使用できます

つまり、order by ではファイル システムのソートを使用しないようにする必要があります。order by フィールドを select の後に配置するか、order by フィールドを where 条件で使用するか、order by フィールドと where 条件フィールドの複合インデックスを作成してください。

2 番目の SQL ステートメントは、2 番目の方法を巧みに使用してインデックスを活用します。 subject_codeで順序を指定してIDを選択するこのメソッド

カウント最適化

データ量が非常に多い場合、explain ステートメントを使用すると、実際におおよその合計データを出力できます。これは、SQL を実際に実行するのではなく、推定値を作成します。

要約する

上記は編集者が紹介したMySQLページングパフォーマンスの調査です。皆様のお役に立てれば幸いです。ご質問がございましたら、メッセージを残してください。編集者がすぐに返信いたします。また、123WORDPRESS.COM ウェブサイトをサポートしてくださっている皆様にも感謝申し上げます。

以下もご興味があるかもしれません:
  • MySQL の集計関数 count の使用法とパフォーマンスの最適化テクニック
  • MySQLクエリのパフォーマンスに影響を与える大きなオフセットの理由と最適化の詳細な説明
  • MySQL挿入パフォーマンスを最適化する方法の例
  • MySQL パフォーマンスの包括的な最適化方法リファレンス、CPU、ファイルシステムの選択から mysql.cnf パラメータの最適化まで
  • MySQL と MariaDB の違いについての簡単な説明 (MariaDB と MySQL のパフォーマンス比較)
  • 数千万のデータを扱うMySQLのページングクエリのパフォーマンスを最適化する
  • MySQL バッチ SQL 挿入パフォーマンス最適化の詳細な説明
  • MySQL の重要なパフォーマンス インデックスの計算と最適化方法の概要
  • MySQL のデータベース パフォーマンスに影響を与える要因の説明

<<:  React を使って小さなプログラムを書くための Remax フレームワークのコンパイル プロセス分析 (推奨)

>>:  Ubuntuがネットワークに接続できない場合の解決策

推薦する

CSS における重要なカスケード概念の詳細な説明

最近、プロジェクトの過程で問題に遭遇しました。メニューバーを常に上部に表示し、後続の要素をその下に表...

ネイティブ JavaScript でシンプルな Gobang ゲームを実装する

この記事では、JavaScriptで簡単なGobangゲームを実装するための具体的なコードを参考まで...

HTML ウェブページの段落レイアウトと改行

Web ページの外観はレイアウトに大きく左右されます。ページ内に長い段落のテキストがある場合、通常は...

CSS3 フィルターの違いと応用の詳しい説明:ドロップシャドウフィルターとボックスシャドウ

標準 CSS3 を使用して要素の影の効果を実現するには、2 つの手順があります。1 つ目は一般的なb...

Linux で PHP を 5.6 にアップグレードする実用的な方法

1: ターミナルに入ったらPHPのバージョンを確認する php -v出力は次のようになります。 PH...

React Native APPのアップデートに関する簡単な説明

目次アプリ更新プロセス大まかなフローチャートアプリ情報の更新1. まず取得する必要があるファイルアド...

CSS のインライン スタイルに変換するソリューション (css-inline)

シーンについて話すメールを送信サードパーティのウェブサイトにHTMLを埋め込む他の編集者の記事をコピ...

Vue の nextTick について話す

データが変更されても、DOM ビューはすぐには更新されません。変更直後にノードまたはその値を取得しよ...

CocosCreator 学習モジュールスクリプト

Cocos Creator モジュラースクリプトCocos Creator を使用すると、コードを複...

LinuxのCPU負荷とCPU使用率の詳細な説明

CPU 負荷と CPU 使用率これらは両方とも、ある程度、マシンの忙しさを反映できます。 CPU 使...

CSS3のall属性の使い方を理解する

1. 互換性以下のように表示されます。 互換性は問題ありません。IE を除き、他のブラウザは基本的に...

Vueカスタムテーブル列実装プロセス記録

目次序文レンダリングsetTable コンポーネント使用結論序文フォームを使用して PC 側のプロジ...

MySQL 5.7.16 ZIP パッケージのインストールと設定のチュートリアル

この記事では、MySQL 5.7.16 ZIPパッケージのインストールと設定のチュートリアルを参考ま...

VueのID認証管理とテナント管理の詳細な説明

目次概要ボタンレベルの権限アイデンティティ認証管理R/U 権限権限の更新テナント管理テナント切り替え...

HTML テーブル マークアップ チュートリアル (38): ヘッダーの境界線の色属性 BORDERCOLOR

テーブルを美しくするために、ヘッダーに異なる境界線の色を設定できます。基本的な構文<TH 境界...