railsでMySQLのIndex Hintを使う
たまにMySQLのオプティマイザが上手いことやってくれなくて、インデックスを貼っているのにそのインデックスを使ってくれなかったり、意図しないインデックスを使っていたりする場面に以前遭遇した。
で、こういうときどうするのだろうと思ったのだけど、明示的にRails側で利用するインデックスを指定するscopeを用意するのが、よくある方法らしい。
Index Hintを指定したscopeを用意
MySQLで利用するインデックスを指定するにはUSE INDEX
とかFORCE INDEX
(Index 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})") }
※ 以下のリンクのコードを引用にさせてもらった