背景:LIMIT 0,20このページングモード、1万人に達し成長しているオフセット値とは、クエリは、クエリは、条件を最適化するためにインデックスを使用することができ、1秒以上が必要になります。
SQL:メンバーから*を選択する場所の状態= 1つの限界0,20; 改写会員ID> = 1及びステータス= 1つの限界20 SELECT * FROM。
スニペット:
/ * * *リミットページの最適化 * @authorエアコム * /
$のstartTime =時間();
$条件 = [ 【 'ステータス'、 '='、1]、 [ 'プラットフォーム'、 '='、1] ]; $カウント =メンバー:: クエリ() - >ここで、($条件) - > 数( 'ID' )。 $のpageSize = 20 ; $ PAGENUM = CEIL($カウント / $のpageSize )。 $ startMemberId = 1 ; 用($ I ; = 1 $ iが <= $ PAGENUM ; $ iは ++ ){ $条件 = [ [ 'ID'、 '> ='、$ startMemberId ]、 [ 'ステータス'、 '='、1]、 [ 'プラットフォーム'、 '='、1] ]; $結果 =メンバー:: クエリ() - >($条件) - > [並べ替え( 'ID'、 'ASC' ) - >リミット($ pageSizeを) - > (GET); もし($結果 - > isNotEmpty()){ $ memberArr = $結果 - > のtoArray(); ディスパッチ(新しい TransferMemberJob($ memberArr )); $ startMemberId = 最大(array_column($ memberArr、 'ID'))+ $のpageSize 。 } 他{ $ startMemberId = $ startMemberId + $のpageSize 。 } $この - >情報(のsprintf( 'ページ=%sの、startMemberId =%s'は、$ I、$スタート)MEMBERIDを)。 }
$ endTimeの時間=();
$秒= $のendTimeの- $ startTimeの。
$時間=はsprintf( '%2F。'、$秒/ 3600);
$ RPS =はsprintf( '%2F。'、$カウント/ $秒)。
$ QPS =はsprintf( '%2F'、$ PAGENUM / $秒)。
の$ this - >インフォ(はsprintf( '%sのクエリ/秒、%sの行/秒、コスト%sの時間、合計%sの行、%S /%sのすべての完成'、日付( 'はYmd H:I:S 」、$のstartTime)、日付( 'はYmd H:I:S'、$ endTimeは)、$数、$時間、$ RPS、$ QPS));