蚊帳の中の日記

ゆるく生きてます

railsでMySQLのIndex Hintを使う

たまにMySQLオプティマイザが上手いことやってくれなくて、インデックスを貼っているのにそのインデックスを使ってくれなかったり、意図しないインデックスを使っていたりする場面に以前遭遇した。

で、こういうときどうするのだろうと思ったのだけど、明示的にRails側で利用するインデックスを指定するscopeを用意するのが、よくある方法らしい。

Index Hintを指定したscopeを用意

MySQLで利用するインデックスを指定するにはUSE INDEXとかFORCE INDEXIndex Hint)を使う事になる(Index HintはMySQLの一機能になる)。

で、RailsでIndex Hintを使ってクエリを発行したいとき、modelにuse_indexみたいなscopeを用意して、それを使ってindex指定したクエリを発行するのが、よくあるやり方っぽい。

scope :use_index, ->(index_name) { 
  from("#{self.table_name} USE INDEX(#{index_name})")
}

※ 以下のリンクのコードを引用にさせてもらった

qiita.com