MySQL Casual Talks vol.3 にいってきた&しゃべってきた
MySQL Casual Talks Vol.3 : ATND に行ってきた。実際にMySQLを使っている人がどう使っているのか、という話がすごく色々と聞けた、大変面白いイベントだった。主催の @myfinder さん、会場提供していただいた日本オラクルの方々、ほんとうにありがとうございました。
で、自分も超LT(1分!)の枠をもらったので、だいぶネタ寄りの方向だけどしゃべってきた。
最近なんでもFluentdの話になっていますが、そういう時期なのです、ご了承ください。このプラグインの話はあとで別途書く。
で、懇親会で飲みながらしゃべってたときに電撃的に思い出したんだけど、このネタを考えついたときには
「これでFluentdに入ったデータをMySQLに入れられるようになったので、こちらの fluent-plugin-mysqlslowquery と組合せて、出てきたslow query logをそのままそのMySQLにツッコんでやることが可能に!!!!!」
みたいな超ウケ抱腹絶倒間違いなしな笑いを取りに行こうと思っていたんだった! スライド作りはじめたときには忘れてたよ! なんてこった!
fluent-plugin-mysql released!
FluentdからMySQLにデータを挿入するためのプラグイン fluent-plugin-mysql を公開しました。
tagomoris/fluent-plugin-mysql · GitHub
fluent-plugin-mysql | RubyGems.org | your community gem host
機能としては以下のどちらかを指定してDBにデータを突っ込む、というようなものになっております。
- 指定したフィールドの値を指定したカラムに挿入(INSERT)
- メッセージ全体をJSONにして指定したカラムに挿入
JSONで突っ込む場合には奥一穂さんの mysql_json を使うとたいへん便利になると思います。
基本的に現在は性能面のことは(ほとんど)考えておらず、そのまま大量のデータをこれを使ってmysqlに入れようとすると間違いなく酷いことになると思います。どうしても頑張りたい場合には blackhole engine などを使ったハックに血道を上げると良いのではないでしょうか。さすがにオススメできませんが。
また fluent-plugin-mongo がサポートする tag_mapped などの機能も現時点では持っていません。メッセージのタグ/時刻を保存対象にする方法も現時点ではありません。このあたりはそのうちどうにかしたいなーというか、pullreqをお待ちしていますというか、そういう状態です。
MySQLへの抑えられない思いを存分に表現したいという方は使ってみるといいんではないかと思います。
mysql2-cs-bind released!
前に RubyでMySQLに繋ぐためのruby-mysqlとmysql2 - tagomorisのメモ置き場 というエントリで書いたとおり、いまおそらく最もよく使われそうな mysql2 という ruby用のmysqlドライバにはprepared statementを扱うためのAPIがない。MySQLではprepared statementを使っても使わなくても速度に影響は無いらしい(後のtweet参照)し、O/R Mapperを経由しての使用がメインだから不要、という判断なのだろう。
(p19)MySQLの場合: PreparedStatementプール機能の利用有無は、性能にまったく影響しません・パラメータのバインド機構の利用有無は、性能にまったく影響しません / Microsoft PowerPoint - URL
しかし自分はO/R Mapperを使わない書き方をすることが非常に多く、そういうケースで自分で値をエスケープしながらSQLに埋め込んでいくのは非常に嫌だ。なんというかDB2で育った自分の本能が拒否する。SQLを書いてある文字列リテラルでの変数展開は悪だし、SQL文を文字列結合で組み立てるのも悪だ!!!!!!!という肌感覚が抑えられない。
なので、先のエントリを書いたあとでmysql2を使う機会がいくつかあり、しょうがなくクライアントサイドでバインド変数を擬似的に実現するようなインターフェイスを作って使っていた。ら、昨夜の MySQL Casual Talks vol.3 で @Spring_MT さんがその話をされてた。
手動エスケープとかカジュアルじゃないわ #mysqlcasual
まあ、やっぱり同じこと気にする人は世の中にいるのかな、ということで、せっかくなのでコードを整理してテストを書いて公開することにした、というのがここまでの流れでした。これで自分が使うときもラクができるし。
tagomoris/mysql2-cs-bind · GitHub
mysql2-cs-bind | RubyGems.org | your community gem host
使いかた
mysql2のかわりに mysql2-cs-bind をrequireすれば、あとは普通にMysql2::Clientを使うだけです。が、バインド変数を使うときは Mysql2::Client#xquery を使います。
# require 'mysql2' されてても特に問題ないけど require 'mysql2-cs-bind' client = Mysql2::Client.new(....) client.xquery('SELECT x,y,z FROM tbl WHERE x=? AND y=?', 16777216, 'ORANIE') #=> Mysql2::Result
返り値は Mysql2::Client#query のものと完全に同じ。そのほかいくつか注意事項があるので、READMEを読んでください。
かじゅある!!!!