2015年9月17日木曜日

MySQLでフルテーブルスキャンが発生していた話

テーブルA
==============
id INT PK
code1 VARCHAR(4)
code2 VARCHAR(4)
 
テーブルB
==============
code1 VARCHAR(4) PK
name1 VARCHAR(4)
 
テーブルC
==============
code2 VARCHAR(4) PK
name2 VARCHAR(4)
 
のようなテーブルがあり、
 
select 1
from A 
inner join B
on A.code1 = B.code1
inner join C
on A.code2 = C.code2 
 
 をexplainするとテーブルBは主キーで検索されていたが、テーブルCはなぜかフルテーブルスキャンされていた。実際はもっと複雑なSQLでヒント文をつけたり、SQLをこねくり回したが結果は変わらず。
数時間たっても分からず、その日はあきらめて定時で帰り、眠りにつこうとした時に「もしかして・・・」と突然閃いた。予想は的中していた。
原因はテーブルCだけ文字コードが異なっていたためだった。

0 件のコメント:

コメントを投稿