MySQL で prepared statement を使うと query cache が効かない

なんかやけにパフォーマンスが出ないなーと思ったら、MySQLのクエリーキャッシュが全然効いていなかった。なんでだろうと思ったら、

という合わせ技だった。

そんな罠があったのかよ。MySQL 4.1のマニュアルには書いてなかったけど、MySQL 5.0のマニュアルには「It was issued as a prepared statement, even if no placeholders were employed. 」と書いてあったよ。せめてプレースホルダーがないパターンだけでもキャッシュしてくれればいいのに。

いしなお! - MySQLのクエリーキャッシュが効かない

なんと、prepared statement にそんな孔明の罠があったとは!

Ruby 用の MySQL ドライバでは、prepared statement を使わなかったらデータをすべて文字列として返すので、データ型を変換させるために prepared statement を使っている人は多いんじゃないか。しかし prepared statement にそんな制約があったら、やっぱり使うべきじゃないのかな。

といっても、今使っているレンタルサーバは query cache が on になってないけどな! on にするには root 権限が必要だから、どうしようもない。


でもさー、MySQL の query cache 機能って、みんな知ってた? ワシはついこの間まで全然知らんでのぅ・・・これを知らずにプログラムを一生懸命チューニングしていた自分がバカだったわ。
この機能は Oracle にはなかったと思うから、これって MySQL の大きなアドバンテージだよね。