読者です 読者をやめる 読者になる 読者になる

ぱいぱいにっき

Pythonが好きすぎるけれど、今からPerlを好きになりますにっき

Test::mysqldをramdisk上で動かしてみる

はい、どうも。
「もっとDB使ったテストを早くしたーい」ということで、いろいろ試してみました。

DBで早くする -> インメモリデータベース!? って感じで短絡的に考えてそういうアプローチです。
とりあえずMySQLでMEMORYストレージエンジンなるものが使えると聞いて、ホエーって思ってテストで使うテーブルのENGINEをMEMORYに一斉置換して走らせてみたんですけれど、まあ通りませんね。だってトランザクション使えないし、BLOBとTEXT型も使えないし。

というわけで、じゃあMySQL側を騙してみるかということで、Sys::RamdiskというモジュールでRamdiskを作ってdatadirはそれを使ってもらうことにしました。

以下、ベンチマークコード。

意味ないっぽい。

@さんいわく、INSERTした時点でInnoDB bufferに乗っかってるので結局どちらもメモリしか見に行ってないので同じ速度になるとのこと。

じゃあ読むんじゃなくて書き込むのはどうや!ということでDDL(CREATE TABLEしてDROP TABLEする)で試してみました。

速くなりました。でも書き込みといえばさっきのだってINSERTしてる。で、INSERTだけやってもRamdisk版と普通版は速度は変わらないんですよね。MySQLってDDL以外のdisk書き込みが非同期なのか?って思ったけれど、トランザクションでもしない限り1行ずつ同期書き込みしていくし。

とまあ疑問は残りますがそんな感じになりました。もしかしたら環境依存かもしれませんが、DDLでは速いっぽいので、最近Test::mysqldに追加されたcopy_data_fromオプションを使えないケースなどでデータベースの初期化などを高速化したい場合には使えるかもしれません。