状況
何の変哲もない、主キー同士を結合条件にして取得するSQLでインデックスが効かない問題が発生した
SELECT * FROM A, B WHERE A.ID = B.ID
確認したこと
- EXPLAINをSELECTの前につけて実行計画の取得
→ possible_keysがNULLでPRIMARYが候補にも挙がらない - 主キーが本当に設定されているか?
→ 設定されていた - テーブル単体で主キーを条件に検索した場合はどうなるか?
→ PRIMARYのインデックスが利用された - A.IDとB.IDの列の型は一致しているか?
→ 一致している ※型が不一致だとインデックス効かないらしい - ヒント句FORCE INDEX(PRIMARY)を付けてみる
→ PRIMARYが利用されないまま - インデックスの再作成
→ ALTER TABLE で再構築を実施してみるも効果なし
参考:MySQL :: MySQL 5.6 リファレンスマニュアル :: 2.11.4 テーブルまたはインデックスの再作成または修復 - 上記URLに記載のあった照合順序を確認
→ AとBで異なっている!!
参考:【MySQL】照合順序とは? - Qiita
対策
- 照合順序を同一に設定する
- データ変換を実施
これで無事にPRIMARYが利用されるようになりました。
別の型扱いされてしまうんですかね?
検索してもヒットしなかったのでレアケースなんだろうな