Ruby/MySQLの速度

Ruby 2.1.0 preview1 がリリースされたので、Ruby/MySQL の速度を測ってみました。

測定環境

測定内容は https://github.com/tmtm/ruby-mysql/tree/master/bench 参照。

ruby-mysql

すべて Ruby で書かれたバージョンです。

f:id:tmtms:20130928104204p:plain

select_prepare に掛かる時間が 1.9.3, 2.0, 2.1 と増加傾向にあります。

それ以外は 1.9.3 以降はどれもほぼ同じです。

insertinsert_prepare の差は、オブジェクトを MySQL のネットワーク表現に変換している部分によるものでしょうか。 もしかしたら、整数なんかは律儀に変換せずに to_s して文字列として渡してしまった方が速くなるかもしれません。

ruby-mysql-ext

Ruby で遅い部分の処理を C で書いたバージョンです。

f:id:tmtms:20130928104220p:plain

1.8.7 も含め、各バージョンでほとんど差がありません。select は 1.8.7 の方が速いです。 データベースから取り出した文字列から Ruby の String オブジェクトを生成する際に、1.8.7 ではエンコーディングの処理がないからじゃないかと思います。

pure Ruby 版と比べて、insertinsert_prepare の差がほとんどありません。 グラフだとわかりにくいですが実は insert_prepare の方がほんの少しだけ速いです。 PREPARE だと、MySQL サーバー側のクエリのパース処理を省けるので、その分だけ速くなっているのかもしれません。

おまけ MySQL/Ruby

その昔、MySQL/Ruby という名前で MySQL の公式 C API の libmysqlclient を使ったライブラリがあったのですが、それでも測ってみました。

f:id:tmtms:20130928104236p:plain

さすがに速いです。けど、思ってたよりも ruby-mysql-ext との差はありませんでした。

まとめ

  • 1.9.3 以降はあまり速度に違いはない
  • C は速い
  • Ruby/MySQL もうちょっと頑張れ