最近 Rails でプログラム作ったりしてるのですが、Ruby/MySQL が Rails で使えないことがわかったので、1年以上放置していた Ruby/MySQL をいじって使えるようにしてみました。
Ruby/MySQL というのは Ruby スクリプトから MySQL を使用するためのライブラリです。
https://github.com/tmtm/ruby-mysql
ややこしいのですが MySQL/Ruby というのもあります。Ruby/MySQL は Ruby だけで書かれたライブラリで、MySQL/Ruby は C で書かれたライブラリです。Ruby/MySQL は MySQL/Ruby とほぼ互換があります。
Ruby/MySQL はコンパイルの必要がないため Ruby さえ動けばどこでも動くというのと、libmysqlclient を使用しないのでアプリが GPL の影響を受けないというのが特徴です。
インストール
次のようにしてインストールできます。
% gem install ruby-mysql
Railsから使う場合
次のように Rails プロジェクトを作成します。
% rails new hoge --skip-bundle --database mysql
Gemfile を次のように変更します。
gem 'mysql2' ↓ gem 'ruby-mysql'
その後 bundle install。
config/database.yml の mysql2 を mysql に変更します。
Rails の mysql アダプタがなぜかバージョンを 2.8.x に固定しているので、手で変更します(ダサい)。
gems/activerecord-3.2.3/lib/active_record/connection_adapters/mysql_adapter.rb の 5行目をコメントアウト:
# gem 'mysql', '~> 2.8.1'
あとは普通に使えます。
ちなみに MySQL/Ruby の最新は 2.8.2 です。2.8.1 は場合によっては致命的なバグがあるので使わない方がいいと思います。
速度
で、まあ Ruby で書かれているのでやっぱり遅いわけです。速度を測ってみました。Ruby のバージョンは 1.9.3 と 1.8.7 です。
結果:
縦軸は秒です(大きい方が遅い)。処理内容は https://github.com/tmtm/ruby-mysql/tree/master/bench を見てください。
遅っ! SELECT とプリペアドステートメントの遅さが際立ちますね。プリペアドステートメントの方が遅いとか、もうね…。
「Ruby/MySQL(ext)」は、遅そうな処理を一部Cで書きなおしたバージョンです。使用するには gem で ruby-mysql の代わりに ruby-mysql-ext を指定します。
SELECT が格段に速くなりました。この際、全部 C で書きなおしちゃおうかと思ったり思わなかったり…。