MySQL の index hints について
こんにちは、 @kz_morita です。
MySQLのクエリチューニングの一環で、うまく index が聞かずにパフォーマンスが出なかったときに index hints 構文を使用したのでメモです。
index hints 構文 通常のクエリであれば、MySQL のオプティマイザで適切な index が選択され利用されますが、インデックスを選択する方法についてクエリでオプティマイザに提供することができます。
MySQL の公式サイト によると、以下のような構文でオプティマイザにインデックスの情報を提供することができます。
tbl_name [[AS] alias] [index_hint_list] index_hint_list: index_hint [, index_hint] ... index_hint: USE {INDEX|KEY} [FOR {JOIN|ORDER BY|GROUP BY}] ([index_list]) | IGNORE {INDEX|KEY} [FOR {JOIN|ORDER BY|GROUP BY}] (index_list) | FORCE {INDEX|KEY} [FOR {JOIN|ORDER BY|GROUP BY}] (index_list) index_list: index_name [, index_name] ... そもそも使おうとしたきっかけとしては、データ量の多いテーブルに対して SELECT を投げた時にクエリが遅く返ってこない問題が起きた時の調査でした。
調査の過程で explain で実行計画を見たときに、想定していたのと違う index が使用されていたため使用する index をオプティマイザに伝えることで改善しました。
インデックスを指定するためには、USE INDEX や、FORCE INDEX を利用します。