1. 程式人生 > >每天4億行SQLite訂單大數據測試(源碼)

每天4億行SQLite訂單大數據測試(源碼)

nal nbsp 數據源 研究 沒有 pan 6.5 rsh 提升性能

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訂單大數據測試(源碼)