スロークエリ解消で使ったFORCE INDEXについて
LIKE検索を使用した際、インデックスが貼られているにもかかわらず、インデックスが使われずスロークエリになったことがあった。
特に、ワイルドカード(%)が先頭にある場合、インデックスが正しく利用されないケースがしばしば見られる。
そこで使ったFORCE INDECについて紹介する。
FORCE INDEXとは?
FORCE INDEXは、特定のSQLクエリに対してMySQLが特定のインデックスを必ず使用するように指示するためのキーワード。
通常、MySQLのクエリオプティマイザが最適なアクセス方法を自動で選択するが、クエリオプティマイザが意図に反するインデックスを使用する場合や、より良いインデックスを手動で指定したい場合に役立つ。
FORCE INDEXの使用方法
FORCE INDEXはFROM句内のテーブルリファレンスと共に使用します。
単体INDEX
SELECT column1, column2
FROM table_name
FORCE INDEX (index_name)
WHERE condition;
- table_name: インデックスを強制的に使用したいテーブルの名前
- index_name: 使用したいインデックスの名前
- condition: クエリの条件(WHERE句)
使用例
例えば、usersテーブルに対して、idx_username_deleted_atという複合インデックスを強制的に使用させたい場合、次のように記述します。ここでは、usernameとdeleted_atフィールドに複合インデックスがあると仮定します。
複合INDEX
SELECT user_id, username
FROM users
FORCE INDEX (idx_username_deleted_at)
WHERE username LIKE 'john%' AND deleted_at IS NULL;
使用例
このクエリでは、idx_username_deleted_at複合インデックスを使用してusernameが'john%'で始まり、かつdeleted_atがNULLであるレコードを検索するよう強制しています。
実際の事例
あるプロジェクトでは、1000万件のレコードを含むデータベースで、usernameフィールドを使用したLIKE検索に2分ほどかかっていたものがusernameとdeleted_atの複合インデックスを作成し、さらにFORCE INDEXを使用してクエリを実行したところ、3秒以内で結果を取得できるようになった。
注意点
パフォーマンスの影響: 不適切にインデックスを強制すると、クエリパフォーマンスが低下する可能性があるのでFORCE INDEXを使用する場合は、クエリの実行計画を確認し、適切に入れる。
メンテナンス負荷: インデックスを強制的に使用することは、データベースのスキーマやインデックス設計が変更された際に、クエリのメンテナンスを難しくする可能性がある
まとめ
確実にINDEXを貼りたい時に便利。
一緒に働く仲間を募集しています!
株式会社コネクター・ジャパンでは一緒に働いてくれる仲間を募集しています!
事業拡大に伴い、エンジニアさんを大募集しています。
興味のある方は下記リンクから弊社のことをぜひ知っていただき応募してもらえると嬉しいです。
▼会社について
https://www.wantedly.com/companies/cnctor/about
▼代表メッセージ
https://cnctor.jp/10years-anniversary/
▼応募はこちら
https://www.wantedly.com/projects/1522201