ビッグデータ量でmysqlのページングクエリーを最適化する方法

631 ワード

/*********    1001  10    ********/
#   sql  (limit offset,rows)
select * from auth_user limit (1001-1)*10,10;

# django orm  (     sql  )
User.objects.all()[10000,10010]

上記のように、多くのウェブサイトのページング機能の下位実装は、limitと組み合わせてページングを制御するために、フロントエンドからバックエンドにいくつかのパラメータ、例えば開始ページとページサイズに依存することである.
しかし、ビッグデータ量ではクエリー効率の問題が発生します!!!上記の文の実際の下位実行は、最初の行から10010行を見つけ、前の10000行を捨てるためです.従って、ユーザが1001ページ後ろにスクロールすると、オフセットoffsetが大きく(10000)、実際の実行効率が遅い.
一般に、代替方法は、where文が開始ビットを設定し、limitが行数を制御することである.
select * from auth_user where id >= 10000  limit 10;

User.objects.filter(id__gte=10000)[0,10];