SQLite創(chuàng)建的數(shù)據(jù)庫有一種模式IN-MEMORY,但是它并不表示SQLite就成了一個(gè)內(nèi)存數(shù)據(jù)庫。IN-MEMORY模式可以簡單地理解為,本來創(chuàng)建的數(shù)據(jù)庫文件是基于磁盤的,現(xiàn)在整個(gè)文件使用內(nèi)存空間來代替磁盤空間,其它操作保持一致。也就是數(shù)據(jù)庫的設(shè)計(jì)沒有根本改變。
提到內(nèi)存,許多人就會(huì)簡單地理解為,內(nèi)存比磁盤速度快很多,所以內(nèi)存模式比磁盤模式的數(shù)據(jù)庫速度也快很多,甚至有人望文生意就把它變成等同于內(nèi)存數(shù)據(jù)庫。
它并不是為內(nèi)存數(shù)據(jù)庫應(yīng)用而設(shè)計(jì)的,本質(zhì)還是文件數(shù)據(jù)庫。它的數(shù)據(jù)庫存儲(chǔ)文件有將近一半的空間是空置的,這是它的B樹存儲(chǔ)決定的,請(qǐng)參看上一篇SQLite存儲(chǔ)格式。內(nèi)存模式只是將數(shù)據(jù)庫存儲(chǔ)文件放入內(nèi)存空間,但并不考慮最有效管理你的內(nèi)存空間,其它臨時(shí)文件也要使用內(nèi)存,事務(wù)回滾日志一樣要生成,只是使用了內(nèi)存空間。它的作用應(yīng)該偏向于臨時(shí)性的用途。
我們先來看一下下面的測(cè)試結(jié)果,分別往memory和disk模式的sqlite數(shù)據(jù)庫進(jìn)行1w, 10w以及100w條數(shù)據(jù)的插入,采用一次性提交事務(wù)。另外使用commit_hook捕捉事務(wù)提交次數(shù)。
(注:測(cè)試場景為在新建的數(shù)據(jù)庫做插入操作,所以回滾日志是很小的,并且無需要在插入過程中查找而從數(shù)據(jù)庫加載頁面,因此測(cè)試也并不全面)
內(nèi)存模式
磁盤模式
在事務(wù)提交前的耗時(shí) (事務(wù)提交后的總耗時(shí)):
1w | 10w | 100w | |
內(nèi)存模式 | 0.04s | 0.35s | 3.60s |
延伸閱讀
我想了解如何學(xué)習(xí) |