我們有一個數據庫,一個非常簡單的模式:建議數據庫設計 - 密集的插入和刪除大量的記錄
CREATE TABLE IF NOT EXISTS tblIndex(
frame_type INT,
pts VARCHAR(5),
ts_start INT primary key,
ts_end INT)
和應用場景是:
每第二個用戶將插入2〜50條記錄,這些記錄的
ts_start
字段不斷增加。 8小時後,最多有1_800_000條記錄。通過將同步模式設置爲關,迄今爲止性能似乎不錯。因爲每條記錄的數據只有16個字節,所以即使插入速度不太快,我們也可以使用一些緩衝區。8小時後,用戶會告訴我告訴上限ts_start刪除最早的數據,所以我會做
DELETE FROM tblIndex WHERE ts_start < upper_bound_ts_start.
刪除90_000(這是半小時的記錄) 1_800_000現在需要17秒。垃圾位比預期的要長。任何方式來減少這種情況?我們不在乎記錄是否立即同步到硬盤。我們正在考慮啓動一個單獨的線程來執行刪除操作,以使此調用成爲異步。我不確定的是(長時間)刪除是否會影響插入性能,如果他們共享相同的連接?或者我應該使用分離的連接進行插入和刪除?但是通過這種方式,他們是否需要在應用程序級別同步?
搜索。
SELECT ts_start FROM tblIndex WHERE ts_start BETWEEN ? AND ?
- 由於ts_start是主鍵,因此現在我們的需求可以確保性能。我想我應該使用分離的連接進行搜索,對吧?
配置的SQLite:
hard disk database (usb interface)
cache size is 2000
page size is 1024
sync mode is 0 (off)
journal_mode mode is truncate
感謝您的任何建議,以提高刪除性能或對整體設計。
編輯:350M MIPS CPU,沒有太多內存(< 2M)特定於此應用程序。
謝謝,洛特。這是一個很好的建議,「以時間序列號命名每個文件」,我們會考慮這個選擇。我們選擇數據庫的原因是我們想要處理所有搜索,同步和電源故障安全的東西到數據庫。而且我們在嵌入式系統上,所以我們沒有足夠的內存來加載所有這些索引文件(到內存中)。 – pierrotlefou 2009-08-21 01:54:52
您只有4列,其中三個是整數。您可以編寫比SQL更快的自己的搜索。同步文件比數據庫更簡單,更快速,更可靠。 powerfail-fail-safe已經是OS文件系統的一部分。 RDBMS僅適用於具有(a)靈活性,(b)連接和(c)持久性的複雜數據模型。你沒有這些屬性。 – 2009-08-21 10:31:20
我有幾乎相同的需求和平面文件是絕對不是正確的解決方案,除非您可以編碼我搜索和組查詢效率與SGBD一樣... – Mose 2010-01-22 10:28:37