Ruby 2.1.0 preview1 がリリースされたので、Ruby/MySQL の速度を測ってみました。
測定環境
- ThinkPad X220 Core i5 2.3GHz
- Linux Mint 15 32bit
- MySQL 5.6.13
測定内容は https://github.com/tmtm/ruby-mysql/tree/master/bench 参照。
ruby-mysql
すべて Ruby で書かれたバージョンです。
select_prepare
に掛かる時間が 1.9.3, 2.0, 2.1 と増加傾向にあります。
それ以外は 1.9.3 以降はどれもほぼ同じです。
insert
と insert_prepare
の差は、オブジェクトを MySQL のネットワーク表現に変換している部分によるものでしょうか。
もしかしたら、整数なんかは律儀に変換せずに to_s
して文字列として渡してしまった方が速くなるかもしれません。
ruby-mysql-ext
Ruby で遅い部分の処理を C で書いたバージョンです。
1.8.7 も含め、各バージョンでほとんど差がありません。select
は 1.8.7 の方が速いです。
データベースから取り出した文字列から Ruby の String オブジェクトを生成する際に、1.8.7 ではエンコーディングの処理がないからじゃないかと思います。
pure Ruby 版と比べて、insert
と insert_prepare
の差がほとんどありません。
グラフだとわかりにくいですが実は insert_prepare
の方がほんの少しだけ速いです。
PREPARE だと、MySQL サーバー側のクエリのパース処理を省けるので、その分だけ速くなっているのかもしれません。
おまけ MySQL/Ruby
その昔、MySQL/Ruby という名前で MySQL の公式 C API の libmysqlclient を使ったライブラリがあったのですが、それでも測ってみました。
さすがに速いです。けど、思ってたよりも ruby-mysql-ext との差はありませんでした。