MySQLの効率化limit

3680 ワード

ページング・クエリーは、実際の作業でよく発生しますが、異なるデータベースでは、ページング・クエリーの実装方法が異なります.MySQLでのページングはlimitで実現されていますが、limitの効率はどうでしょうか.見てみましょう.
1、ページング問題
ここでLIMITの原理を簡単に説明します.ここではLIMIT N,Mに基づいて、LIMITはまずN+M行を探して、それからN行からM行を取ります.では、このようなSQLは、1回のクエリ1275500に対して1つの操作に対して高価なオーバーヘッドであるべきです.LIMITのような最適化では,Nをできるだけ小さくするか,使わないかを第一の目標とする.
2、最適化方案
  • ページをめくる
  • ページにヒントを与えることができます.今私たちが見ているのは5ページ目で、見終わったら6ページ目を見たいです.6ページ目も同じように20件の記録が表示されています.この例に準じて、6ページ目の日値が5ページ目より小さいことを肯定することができます.5ページ目の最小日値が:2009-11-4であれば、私たちは使用することができます.
    SELECT * FROM pw_gbook WHERE uid='48' and postdate<’2009-11-1ORDER BY postdate DESC LIMIT  20;

    これで6ページ目の内容を調べます.同様に、4ページ目のコンテンツを表示する場合(5ページ目の最大日付を:2009-11-3と仮定)は、4ページ目のコンテンツは:
    SELECT * FROM pw_gbook WHERE uid='48' and postdate>’2009-11-3ORDER BY postdate DESC LIMIT  20;

    もちろん、これは基本的な考え方であり、各ページのデータをソートする必要があります.
  • ジャンプページ
  • 「1,2,3,4,5...」と表示された場合、ページをジャンプできます.2ページ目から5ページ目にジャンプすると、ここに2ページ目の最小日付があります.
    SELECT * FROM pw_gbook WHERE uid='48'  and postdate<’2009-11-3ORDER BY postdate DESC LIMIT  4020;

    ここを見ると、なぜ大手サイトのページが表示されていないのかがわかります.注文できるようにしましょう.あなたにページを入力して飛び越える枠もありません.ジャンプのページが多すぎると、N値が大きすぎるという問題もあります.だから何とかしなければならない.
  • 変換スキーム
  • 私は他の唯一の標識を利用して比較することができて、それによってページングを実現することができます
    元のクエリー
    SELECT * FROM pw_gbook WHERE uid='48' ORDER BY postdate DESC LIMIT 1275480,20;

    変換
    SELECT * FROM pw_gbook WHERE id>1275480 and  uid='48' ORDER BY postdate DESC LIMIT 20;

    まとめ:
    私たちはコードを書く過程で、機能の実現だけでなく、その性能の最適化も考慮しなければならない.どのように高品質のコードを書くかは、ソースコードを多く見て、自分のコードを多く考える必要があります.どんなに大きな成果があっても、少しの努力で積み重ねてきたんだよ、just do it.