為了驗證SQLite的性能巔峰,我們來做一個大數據測試。 模擬每天4億票銷售訂單,分表分庫,每天一個資料庫文件,有訂單號、部門節點、時間等。 租用阿裡雲最低配置ECS,單核1G記憶體,1M帶寬,每年300塊,每天九毛錢 ...
SQLite單表4億訂單,大數據測試
SQLite
作為嵌入式資料庫的翹楚,廣受歡迎!
新生命團隊自2010年以來,投入大量精力對SQLite
進行學習研究,成功應用於各系統非致命數據場合。
SQLite極致性能
- 關閉同步,Synchronous=Off,提升性能。添刪改操作時不必同步等待寫入磁碟,操作系統會延遲若幹毫秒批量寫入
- 設置WAL模式,Journal Mode=WAL,減少鎖定。寫入向前日誌模式,避免多線程訪問時鎖定資料庫,寫入時不必使用排它鎖影響其它線程讀取,而是把事務操作寫入到WAL文件中,延遲合併
- 加大緩存,Cache Size=5000,提升性能。操作系統通過文件映射MapFile把整個資料庫文件映射進入記憶體,實際查詢時會把用到數據所在附近頁預先載入進入緩存,極大提升查詢性能
- 插入速度 5000~16000tps,依賴CPU,HDD/SSD差別不大,主要受限於SQLite.Data.dll的Prepare
- 查詢速度 非首次查詢,緩存命中以後,索引查詢基本上都是毫秒級。資料庫較大則相應加大緩存,速度不變。
- 查記錄數 單表數據超過一千萬行以後,儘量不要使用Select Count,否則可能需要十幾秒到半分鐘的樣子才能返回。NewLife.XCode封裝了'Meta.Count'
當然,SQLite不適合多線程高併發寫入,多線程高併發讀取倒是非常不錯。
因為資料庫就在進程內,高併發讀取一般比其它RDS要快一大截。
總的來說,SQLite資料庫甭管多少數據多大庫文件,只要配置得當,記憶體管夠,性能不是太大問題!
SQLite大數據
為了驗證SQLite的性能巔峰,我們來做一個大數據測試。
模擬每天4億票銷售訂單,分表分庫,每天一個資料庫文件,有訂單號、部門節點、時間等。
1, Test項目生成4億行訂單數據,主鍵自增ID,訂單號建立索引,文件大小26.5G
2, Web項目,魔方+XCode,首次查詢較慢,約427毫秒,需要預熱
不同機器的首次查詢時間偏差比較大,最大可能達到幾秒鐘
本機第一次啟動該項目時,魔方需要從公網下載SQLite驅動文件以及樣式資源文件
3, 第二頁,99毫秒,操作系統文件映射緩存生效
4, 第20000頁,147毫秒,系統緩存依然生效
5, 第200000頁,32021毫秒,距離太遠,文件系統緩存沒有命中
6, 第200001頁,867毫秒,緩存命中
7, 查詢一個中間訂單號000199999980,20毫秒,索引命中
顯然,只要有索引,多大數據都不怕
8, 本地記憶體占用150M。雖然整個資料庫26.5G,但操作系統只會載入需要部分
對於重要程度不是特別高的場合,可以大量使用SQLite庫保存歷史數據,平時用不到的時候只占硬碟,不占記憶體
9, 記錄數Select Count,362058毫秒,約6分鐘,超級慢
SQLite在雲端
http://bigdata.newlifex.com/Admin admin/admin
- 租用阿裡雲最低配置ECS,單核1G,1M帶寬,每年300塊,每天九毛錢
- 部署BigData項目到ECS,訪問正常
源碼及資料庫
大數據源碼 http://git.newlifex.com/Stone/BigData
大數據鏡像 https://github.com/nnhy/BigData
4億訂單數據 http://pan.baidu.com/s/1skZJ2ih
2億訂單數據 http://pan.baidu.com/s/1bo9NFFx
資料庫下載後,解壓縮得到Data.db,拷貝到Web併排的Data裡面,Data裡面還有一個Membership.db
C#/.Net大數據討論群:1600800