今日の自分を支える 技術→マネジメント

技術職→管理職になりました

MySQLでJOINしたテーブルにPRIMARYのインデックスが使用されない

状況

何の変哲もない、主キー同士を結合条件にして取得するSQLでインデックスが効かない問題が発生した

SELECT * FROM A, B WHERE A.ID = B.ID

確認したこと

  1. EXPLAINをSELECTの前につけて実行計画の取得
     → possible_keysがNULLでPRIMARYが候補にも挙がらない
  2. 主キーが本当に設定されているか?
     → 設定されていた
  3. テーブル単体で主キーを条件に検索した場合はどうなるか?
     → PRIMARYのインデックスが利用された
  4. A.IDとB.IDの列の型は一致しているか?
     → 一致している ※型が不一致だとインデックス効かないらしい
  5. ヒント句FORCE INDEX(PRIMARY)を付けてみる
     → PRIMARYが利用されないまま
  6. インデックスの再作成  → ALTER TABLE で再構築を実施してみるも効果なし
     参考:MySQL :: MySQL 5.6 リファレンスマニュアル :: 2.11.4 テーブルまたはインデックスの再作成または修復
  7. 上記URLに記載のあった照合順序を確認
     → AとBで異なっている!!
     参考:【MySQL】照合順序とは? - Qiita

対策

  1. 照合順序を同一に設定する
  2. データ変換を実施

これで無事にPRIMARYが利用されるようになりました。
別の型扱いされてしまうんですかね?
検索してもヒットしなかったのでレアケースなんだろうな