每天4億行SQLite訂單大數據測試(源碼)
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
每天4億行SQLite訂單大數據測試(源碼)