maco's life

主にエンジニアリングと読書について書いていきます。

データを取ってくるときのrow reads減らしたい

以前書いた記事で ^のようにlimit offsetを安易にやると辛いみたいな話を書いたけど、じゃあどうすればいいの?っていう部分まで書いてなかったので書きます。(ほとんど教えてもらったことですが!)

実装方法としては常にprimary_keyを条件に指定してあげれば良くて、

my $id = 0;
while(1) {
    my $rs = models("Schema::Hoge")->search({
        id => { '>' => $id },
    },{
        order_by => "id asc",
        rows       => 1000;
    });
    last if $rs->count <= 0;

    while(my $row = $rs->next) {
        #何らかの処理
        $id = $row->id;
        ...
    }
}

みたいなコードにすれば1000件の対象が絞れるからrow readsへりますよ。