在考慮要使用 SQLite 還是其它資料庫的時候看到了這篇:http://stackoverflow.com/questions/14217249/sqlite-and-concurrency
裡面提到 SQLite 的效能最高可以達到每秒五萬筆 INSERT,但會因硬碟的性能不同而有差異。而我要使用的環境別說每秒上萬筆,一秒有上百次操作就很了不起了。
於是寫了簡單的測試,看看在我機器上跑得怎麼樣:
1 2 3 4 5 6 7 8 |
<?php unlink("mydb.sq3"); $pdo = new PDO("sqlite:mydb.sq3", null, null); $pdo->exec("CREATE TABLE test(counter);"); for($i = 0; $i < 100000; $i++) { $pdo->exec("INSERT INTO test(counter) VALUES($i);"); } |
本來想說每秒五萬筆的話,那我得弄個十萬筆才能執行超過一秒,結果沒想到這一跑就超過了半個小時還沒跑完。平均下來每秒只執行了 38 筆的操作。果然夢想與現實的差距就是這麼大嗎?
不可能吧。於是開始檢討差距這麼大的原因,第一個想到的是硬碟速度的問題,也確實在執行期間硬碟幾乎是一直忙碌的狀態。但我這已經是固態硬碟了,怎麼樣也不會這麼難看吧。而且這已經是少到不能再少的資料了,實際運用上一定會更多資料量的。
後來在這篇文章裡看到了 nosync 這個關鍵字:http://www.sqlite.org/speed.html
進而找到了這個說明:http://www.sqlite.org/pragma.html#pragma_synchronous
所以就開始了第二版的測試:
1 2 3 4 5 6 7 8 |
<?php unlink("mydb.sq3"); $pdo = new PDO("sqlite:mydb.sq3", null, null); $pdo->exec("CREATE TABLE test(counter);"); $pdo->exec("PRAGMA synchronous = OFF"); for($i = 0; $i < 100000; $i++) { $pdo->exec("INSERT INTO test(counter) VALUES($i);"); } |
只加了一行,但這次只花了不到八秒就跑完了。算一算這樣每秒就有上萬筆的操作,雖然跟五萬筆還是差了一些,但應該是很夠用了。