LoginSignup
38
26

More than 5 years have passed since last update.

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

Posted at

はじめに

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句に落とし穴があります:scream:
sex_cdはvarchar型で定義しているので、数値の1をvarcharの"1"へ変換しなくてはならないのです:exclamation:
もちろん、このままでも正しく取得できるのですが、内部でこっそりと型変換処理を行っているため、めちゃくちゃ処理が重くなります。

速いselect文

select * from member
where sex = '1'

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

業務で試してみた結果

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

まとめ

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

38
26
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
38
26