RubyのSequelというライブラリのお話。 mysql=5.5.42
sequel=4.25.0
db[:log_delay].where(:send_dg => false).order(:event_at).limit(1000).all |
こんな処理を書いていて、なんか遅いなー(state=Sorting result
で詰まっている)と思ったら、以下のSQLに変換されていました。
SELECT * FROM `log_delay` WHERE (`send_dg` IS FALSE) ORDER BY `event_at` LIMIT 1000 |
IS FALSE
..だと!? なお、インデックスは send_dg
とenvet_at
に付けています。
本来発行したいSQLは以下です。
SELECT * FROM `log_delay` WHERE (`send_dg` = false) ORDER BY `event_at` LIMIT 1000 |
こう書いたら目的通りのSQLが生成されました。
db[:log_delay].where(:send_dg => Sequel.lit('false')).order(:event_at).limit(1000).all |
そして詰まりも無くなりました。