[MySQL] updated_atで絞り込むカーソル方式ページネーションをするSQL

ソース: https://speakerdeck.com/ainame/jia-zu-arubamumitene-kai-fa-feng-jing-number-realm-jp?slide=26

where (updated_at > ?) or (updated_at = ? and id > ?) order by updated_at, id limit 50 

のようにすればOK。 MySQLのインデックスは昇順に並んでいる(バージョンに依る)ので、このインデックスの順番にカーソルを進めることでfilesortを起こさず高速な検索ができる。 innodbでのインデックスの末尾にはプライマリーキーが生えているので、updated_atだけのインデックスでよい。 入ってくる検索条件は前回レスポンスの最終要素を入れる。
ぱっと見て難しい検索条件に見えるんですが、「カーソル」をupdated_at, idの2つにしているとこのようになる。 また、カーソルがaccount_id, updated_at, idの3つになっても、検索条件を拡張することでfilesortなしの高速な検索ができる。
以上。