【MySQL】めちゃくちゃ遅いselect文を速くする方法【暗黙の型変換】


はじめに

100件ちょいのレコードを取得するのに30分以上かかっていたselect文がありました。
このselect文を10秒ちょっとにまで速度改善したお話です。

データの内容

※実際に使用したデータは書けないので、説明用のデータです。

テーブル名:member

id name sex(varchar) memo
1 山田太郎 1
2 田中花子 2
3 木村次郎 1 プロジェクトリーダー

ここから男性だけを抽出します。

遅いselect文

select * from member
where sex = 1

一見、何の問題もないように見えるselect文ですが、where句に落とし穴があります
sex_cdはvarchar型で定義しているので、数値の1をvarcharの"1"へ変換しなくてはならないのです
もちろん、このままでも正しく取得できるのですが、内部でこっそりと型変換処理を行っているため、めちゃくちゃ処理が重くなります。

速いselect文

select * from member
where sex = '1'

先ほどのselect文で、where句の「1」をシングルクォートで囲み、varchar型であることを明示しました。
これで、内部でこっそり行われていた型変換がなくなります

業務で試してみた結果

冒頭で書いた通り、100行ちょっとのレコードの取得が30分以上→10秒へと劇的な改善を遂げました
実は、left joinやinner joinを多用し、case whenなども使用していた、入れ子がハンパないことになっていたselect文だったんです。
joinの仕方やcase whenのやり方を考え直さなければ・・・と思い悩んでいたので、シングルクォートだけでここまで改善できたことにめちゃくちゃ驚きました

まとめ

where句などで数値を条件に使用しているときは、varcharやintの型がテーブル定義とずれていないか確認すること。