普通にファイル保存するよりも小さいBLOBに限ってはDBにぶっ込んだ方が早いそうな。
排他とか色々あるから遅いと思ってたのですが、、、、、
それだけ性能上がってるなら普通のテーブルも高速に保存できるのか?
と思ったので検証
環境
- mac(結構前)
- go言語
- SQLite version 3.16.0 2
でsqlite3 VS json VS csv による出力でどれが早いかやってみますか。
jsonはその配列をデコードで出力するだけ、他は1レコード毎にする。
これでcsvより早ければそれはそれで価値があるってことね。
とりあえずsqlite3の勝利で終われば非常に楽だなぁ。
条件
- テーブルは以下にする
- ID(int)
- Title(string)
- value(int)
- 1000件のレコード書き込みを10セット実施する。
結果
DB追加 | CSV | json |
---|---|---|
1.028847秒 | 0.004198秒 | 0.005193秒 |
0.882089秒 | 0.003451秒 | 0.000538秒 |
0.753490秒 | 0.002792秒 | 0.000565秒 |
0.781892秒 | 0.003049秒 | 0.000592秒 |
0.785775秒 | 0.006175秒 | 0.000909秒 |
0.709185秒 | 0.002781秒 | 0.000600秒 |
0.696319秒 | 0.003531秒 | 0.000613秒 |
1.247061秒 | 0.003052秒 | 0.000569秒 |
0.774548秒 | 0.002544秒 | 0.000595秒 |
0.977571秒 | 0.002651秒 | 0.000593秒 |
予想通り、やはり特定条件だけですね。
なんとなくDBの性能による副産物な感じがします。
セミオープン状態になってるとでもいいますかね。
そして、この際NoSQLでも試してみますかね。
改定
改めて時間ができたのでエントリーをみたところ、トランザクション閉じてないってことね。ということでやって見ました結果以下のようになりました。
一番時間がかかっているのが、本エントリーの最初のやつです。
変更した結果、このスケールのグラフだとほぼ変わらんところまで行きました。
それをやったあと、気づいたのはブロブ保存でそこそこのVARCHARを保存しないとダメじゃないかと思ったけど、本件については一旦完了と言うことで。