db 日誌與 fs 日誌
SQLite 有一個用於 journal_mode 的編譯指示,我假設它可以在其他 sql 數據庫程序(MySQL、PostgreSQL、MS-SQL 等)中使用,所以這個問題也適用於所有像 SQLite 一樣提供日誌模式的數據庫程序。
大多數現代文件系統(BtrFS、Ext4、NTFS 等)都使用日誌。由於數據庫通常儲存在日誌文件系統上,數據庫程序也記錄日誌不是多餘的嗎?
啟用 SQLite journal_mode 時,與禁用 journal_mode 相比,大量更新和/或插入需要非常長的時間才能完成。
SQLite 的編譯指示是特定於 SQLite 的;你不會
PRAGMA
在其他引擎中找到它們(或者實際上是語句)。至於數據庫“日誌”,這只是 SQLite 的事務日誌名稱(參見
journal_mode
SQLite 參考中的條目)。事務日誌與文件系統日誌完全不同,通常不是您想要禁用的東西。如果沒有事務日誌,您將無法回滾事務,並且(如鍊接文件所述):“如果應用程序在設置 OFF 日誌模式時在事務中間崩潰,那麼數據庫文件很可能會損壞。”文件系統日誌有助於確保文件系統在崩潰後(不久)保持一致;但這並沒有說明從應用程序(例如 SQLite)的角度來看,該文件系統中文件的內部結構是否一致。
換句話說:不,它不是多餘的,並且大多數其他數據庫不提供任何禁用事務日誌的選項。我建議如果您的插入和更新進展緩慢,可能還有其他原因(每個事務進行了多少更改等)
日誌對於使數據庫能夠提供他們承諾的 ACID(原子、一致、隔離、持久)保證至關重要。SQL-ite 支持模式:
DELETE
,TRUNCATE
,PERSIST
,MEMORY
,WAL
,OFF
DELETE
,TRUNCATE
,PERSIST
指定每次事務送出後處理日誌文件的不同方式。WAL
- 預寫日誌記錄允許就地更新數據庫文件。MEMORY
,OFF
- 允許崩潰時的不一致狀態,儘管OFF
“允許使用普通 SQL 破壞數據庫文件”為了提高性能,預寫日誌 (WAL) 有時會有所幫助,或者使用為多個並發寫入者設計的數據庫。