Ruby/MySQL

最近 Rails でプログラム作ったりしてるのですが、Ruby/MySQLRails で使えないことがわかったので、1年以上放置していた Ruby/MySQL をいじって使えるようにしてみました。

Ruby/MySQL というのは Ruby スクリプトから MySQL を使用するためのライブラリです。

https://github.com/tmtm/ruby-mysql

ややこしいのですが MySQL/Ruby というのもあります。Ruby/MySQLRuby だけで書かれたライブラリで、MySQL/Ruby は C で書かれたライブラリです。Ruby/MySQLMySQL/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 に変更します。

Railsmysql アダプタがなぜかバージョンを 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 です。

結果:

f:id:tmtms:20120503171652p:image

縦軸は秒です(大きい方が遅い)。処理内容は https://github.com/tmtm/ruby-mysql/tree/master/bench を見てください。

遅っ! SELECT とプリペアドステートメントの遅さが際立ちますね。プリペアドステートメントの方が遅いとか、もうね…。

Ruby/MySQL(ext)」は、遅そうな処理を一部Cで書きなおしたバージョンです。使用するには gem で ruby-mysql の代わりに ruby-mysql-ext を指定します。

SELECT が格段に速くなりました。この際、全部 C で書きなおしちゃおうかと思ったり思わなかったり…。

まとめ

Ruby/MySQL を作るために MySQL のプロトコルをさんざん調べたので、一度ちゃんとまとめておきたいと思ったりしてます。