技術日記
MySQLのクエリーキャッシュが効かない 解決編Edit

この間書いたZend_Db_Adapter_Pdo_Mysql経由でMySQLに接続しているとクエリーキャッシュが効かないという話、ひとまず解決方法を見つけた模様。結論から言うと「PHP 5.2.1にあげれ」。

ポイントとしては、PHP 5.2.1 Release Announcementの主要な拡張ポイントとして書かれている、「PDO_MySQL now uses buffered queries by default and emulates prepared statements to bypass limitations of MySQL's prepared statement API.」って部分。その辺のソースも読んでないし、MySQL API関連の詳しい事情もよく分からないけど、ともかくPHP 5.2.1では、PDO_MySQLの実装として、MySQLのプリペアードステートメントを使うのはやめ、エミュレーション実行することにしたらしい。で、試しにPHP 5.2.1に入れ替えてみたところ、ちゃんとクエリーキャッシュが効くようになってくれたよ。

一応自前で、Zend_Db_Adapter_Pdo_Mysqlのfetch系メソッドだけオーバーライドして、mysqli関数経由で非プリペアードステートメントを投げる実装に置き換えたクラスとか書いてみていたんだけど、そういう中途半端な対策をするよりもすぱっとPHP 5.2.1に置き換えた方がましそうだ。

ちなみにZend Frameworkのincubatorの中には、Zend_Db_Adapter_Mysqliクラスとかがあって、ちょっと期待したんだけど、どうやらこれはろくにメンテナンスされなかったために、コアからincubatorに格下げになった代物だったらしい。試しに使ってみたけど、完成度が低くて使い物にならなかった。っつーか、拡張して使う気にもなれなかった。

Published At2007-02-09 00:00Updated At2019-12-31 00:02