ホームページ  >  記事  >  データベース  >  MySQL ページング テクノロジの概要

MySQL ページング テクノロジの概要

巴扎黑
巴扎黑オリジナル
2017-05-01 13:48:091293ブラウズ

友人は「MySQL のページングは​​常に問題になっているようですが、何か最適化方法はありますか?」と尋ねました。オンラインで推奨されているページング方法をいくつか見たのですが、それについてコメントしていただけますか。

方法 1: データベースが提供する SQL ステートメントを直接使用する

---ステートメント スタイル: MySQL では、次のメソッドを使用できます: SELECT * FROM テーブル名 LIMIT M,N。

---適用可能なシナリオ: データ量が少ない状況 (数百/数千のタプル レベル) に適しています。

---理由/欠点: フル テーブル スキャンは非常に遅くなり、一部のデータベース結果セットは不安定な状態を返します (ある回は 1,2,3 を返し、別の回は 2,1,3 を返すなど)。 Limit は、結果セット内の M 位置からの N 出力を制限し、残りを破棄します。

方法 2: 主キーまたは一意のインデックスを作成し、そのインデックスを使用します (ページごとに 10 項目を想定)

---ステートメント スタイル: MySQL では、次のメソッドが利用可能です:

SELECT * FROM テーブル名 WHERE id_pk > (pageNum*10) LIMIT M.

---適用可能なシナリオ: 大量のデータ (数万のタプル) がある状況に適しています。

---理由: インデックス スキャンは非常に高速になります。友人は、データクエリが pk_id に従ってソートされていないため、データが欠落する場合があり、唯一のオプションは方法 3 であると提案しました。

方法 3: インデックスに基づいて並べ替える

---ステートメント スタイル: MySQL では、SELECT * FROM テーブル名 WHERE id_pk > (pageNum*10) ORDER BY id_pk ASC LIMIT M を使用できます。

---シナリオに適応する: 大量のデータ (数万のタプル) がある状況に適しています。ORDER BY の後の列オブジェクトが主キーであるか、一意であることが最善です。これにより、ORDER BY 操作を削除できます。インデックスは安定していますが、結果セットは安定しています (安定性の意味については、方法 1 を参照してください)。

---理由: インデックスのスキャンは非常に高速になりますが、MySQL のソート操作には ASC のみがあり、DESC はありません (DESC は偽物で、本物の DESC は将来行われる予定です。楽しみにしていてください)。

方法 4: インデックスに基づいて準備を使用します (最初の疑問符は pageNum を表し、2 番目の? はページごとのタプルの数を表します)

---ステートメント スタイル: MySQL では、次のメソッドが利用可能です:

PREPARE stmt_name FROM SELECT * FROM テーブル名 WHERE id_pk > (?* ?) ORDER BY id_pk

ASC リミット M.

---大量のデータ量のシナリオに適応します。

---理由: インデックスのスキャンは、prepare ステートメントの方が一般的なクエリ ステートメントよりも高速です。

方法 5: MySQL を使用して ORDER 操作をサポートすると、インデックスを使用していくつかのタプルをすばやく見つけ、テーブル全体のスキャンを回避できます

---例: 行 1000 から 1019 のタプルを読み取ります (pk は主キー/一意キーです)。

---SELECT * FROM your_table WHERE pk>=1000 ORDER BY pk ASC LIMIT 0,20。

方法6:「サブクエリ/結合+インデックス」を使用してタプルの位置をすばやく特定し、タプルを読み取ります。原理は方法5と同じです

。 ---例 (id は主キー/一意キー、青色のフォントの変数):

サブクエリの使用例:

SELECT * FROM your_table WHERE id <=
(SELECT id FROM your_table ORDER
BY id desc LIMIT ($page-1)*$pagesize ORDER BY id desc
LIMIT $pagesize

接続活用例:

SELECT * FROM your_table AS t1
JOIN (SELECT id FROM your_table ORDER BY
id desc LIMIT ($page-1)*$pagesize AS t2
WHERE
t1.id <= t2.id ORDER BY t1.id desc LIMIT $pagesize;

メソッド 7: ストアド プロシージャ クラス (上記のメソッド 5/6 と組み合わせることが望ましい)

---発言スタイル: もう与えられません

---データ量が多いシナリオに適応著者推奨の方法

---理由: サーバー内で操作をカプセル化すると、比較的高速になります。

方法 8: 逆の方法

---インターネット上の誰かが SQL_CALC_FOUND_ROWS の使用について書いていました。 意味がないので真似しないでください。

基本的にはすべてのデータベースに拡張でき、原理は同じです。ただし、方法 5 を他のデータベースに拡張することはできません。プロモーションの前提条件は、他のデータベースが ORDER BY 操作をサポートし、インデックスを使用してソートを直接完了できることです。

以上がMySQL ページング テクノロジの概要の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。