2015-09-28 72 views
4

我今天從SQLite的一本書中讀到了有關關鍵字「:memory:」的內容,但它只是說明它是什麼,如何使用以及解釋太短。所以我在這裏搜索更多的信息,但無法獲得SQLite特定的信息。SQLite中內存數據庫的優點

  1. ':memory:'mode有什麼優勢? (我什麼時候需要這個?)

  2. 內存數據庫的性能是否更快?

  3. 我仍然需要在內存數據庫上使用事務嗎?

+2

主要優點,性能。當與數據庫的連接關閉時,它將消失。請參閱http://stackoverflow.com/questions/849679/temporary-in-memory-database-in-sqlite – Dijkgraaf

+0

謝謝,但我已經閱讀了該主題,並不清楚性能。我還閱讀了其他DBMS(如MySQL)上的一些線程,而那些說臨時數據庫不是更快。這就是爲什麼我在這裏問的原因。 – Jenix

+1

「臨時數據庫/表」和「內存數據庫」之間是有區別的臨時的仍然可以在磁盤上。 – Dijkgraaf

回答

15

a SQLite in-memory database的主要優點是性能:不是讀寫磁盤,而是將整個數據庫保存在內存中。內存比磁盤快得多。使用旋轉磁盤或大量IO加載服務器可以獲得最大的性能提升,使用SSD的性能會有所降低。

但是,這不是寫出錯誤的查詢和表格的萬能藥。在到達內存數據庫以提高性能之前,請確保優化您的表設計,查詢和索引。

主要缺點是一旦進程關閉數據庫就沒了。數據庫不能大於可用內存。

提交可能會更快,因爲不需要寫入磁盤,所以自動提交模式可能會更快,但事務仍應用於數據完整性目的。

請注意,不會太大的臨時SQLite數據庫可能會存儲在內存中。

由於它的缺點,並且因爲內存比存儲少得多,所以在提交到內存數據庫之前,請嘗試使用臨時數據庫。這是通過對數據庫文件名使用''來完成的。這將寫入臨時文件,但將工作緩存在內存緩存中。這是兩全其美的,你可以在不使用太多內存的情況下提升性能。

即使一個磁盤文件被分配給每個臨時數據庫,在實踐中,臨時數據庫通常駐留在內存中的尋呼機緩存,因此是「創造一個純粹的內存數據庫之間的差別非常小:內存:「和一個由空文件名創建的臨時數據庫。唯一的區別是,「:memory:」數據庫必須始終保留在內存中,而如果數據庫變大或SQLite受到內存壓力,臨時數據庫的某些部分可能會刷新到磁盤。

對您的應用程序進行配置文件和基準測試,以確保它會提高性能,請考慮優化查詢並添加索引是否更好,並確保數據消失後確定。

+0

哇謝謝!!!你能否回答第3號?由於性能原因,我總是使用事務,這對於使用內存數據庫時也有幫助嗎? – Jenix

+2

@Jenix無論性能如何,您都應該使用事務來實現數據完整性目的。 – Schwern

+0

好的,謝謝:) – Jenix