DBD::MySQLのprepareはPREPAREステートメントじゃなくてクライアントの中でゴニョゴニョしてるだけだよ、と教えてもらった。 試したらマジだった。。
2013-11-07 22:46:13MySQL本来のPREPAREステートメント、値をバインドする時にユーザー変数に突っ込まないといけないからなんだろうな。。
2013-11-07 22:47:58@yoku0825 RubyのActiveRecordも、PHPのPDO_MYSQLやMDB2/MySQLもデフォルトの挙動はクライアント側で展開していますよー。
2013-11-07 22:58:46@yoku0825 connectするときに何だったか指定すればちゃんとprepareされるはず!ただその場合でもPREPAREステートメント実行するんじゃなくC API叩くんじゃなかったかな(うろ覚え
2013-11-07 23:04:04@yoku0825 手前味噌なれど、 php の pdo についてなら http://t.co/OkaqgocEkT を参照していただけると。デフォルトでは prepared statement はクライアント側でエミュレートされますです。
2013-11-07 23:21:39@yoku0825 DBD::mysql、PREPAREステートメントいちおうサポートしてるんですけど、一般的なWebアプリケーションだとPREPAREしたのを何度も使いまわせる作り方をしないのでクエリ数が約2倍になってネットワークのレイテンシが乗って遅くなると理解してます。
2013-11-08 08:06:25@yoku0825 @kamipo Javaなどの場合でも、少なくとも数年前はサーバサイドプレペアは非推奨だったかと。ステートメントの解析結果を保存するサーバサイドの情報のexpireができない(接続が切断されるまで)とか、実行プランをキャッシュするわけではないので速度向上小とか
2013-11-08 10:44:321:Nレプリケーションの人がちゃんとぺちぱーをやっていた瞬間。。 PHP と MySQL と サーバサイド プリペアードステートメント - do_akiの徒然想記 http://t.co/q5cO7DwsFS
2013-11-08 10:48:10@kazuho @kamipo MySQLに限らず、WEBシステムでは…って感じになる(だった)んでしょうか。そしてアレ、パースまで終わらせておくのかオプティマイズまで終わらせておくのかが実装ごとにかなり違いそうな予感がします。。
2013-11-08 12:02:20@yoku0825 @kamipo MySQL のサーバサイドプリペアードステートメントの問題については http://t.co/B5xGSdnVZw が詳しいかと思います。今は違うのかも
2013-11-08 12:09:08@methane @yoku0825 @kamipo 実行プランたてるたびに統計情報を更新してるRDBMS実装ってあるんでしょうか。少なくともInnoDBはしてなかったはず
2013-11-08 12:43:56@kazuho @methane @yoku0825 @kamipo Oracle 11gR2以降でCardinality Feedbackという機能があります。ただし毎回ではなく「どうもおかしい」と思ったときのみ発動します。PDF→ http://t.co/lygty45GOX
2013-11-08 13:01:10