sqlite是款不錯的數據庫,使用方便,不需要事先安裝軟件,事先建表。很多人擔心它的性能和數據存儲量問題。
比如有的網友問:Sqlite數據庫最大可以多大呀?會不會像acc數據庫那樣,幾十MB就暴掉了?
不會的,放心用SQLite, 這是兩個數量級的東西, 看下面的說明。
Access不能算真正意義上的數據庫,但是Access是前台和后台在一起,對小用戶還是有其優點。
SQLite,是一款輕型的數據庫,是遵守ACID的關系型數據庫管理系統,它的設計目標是嵌入式的,而且目前已經在很多嵌入式產品中使用了它,它占用資源非常的低,在嵌入式設備中,可能只需要幾百K的內存就夠了。它能夠支持Windows/Linux/Unix等等主流的操作系統,同時能夠跟很多程序語言相結合,比如 Tcl、C#、PHP、Java等,還有ODBC接口,同樣比起Mysql、PostgreSQL這兩款開源的世界著名數據庫管理系統來講,它的處理速度比他們都快。SQLite第一個Alpha版本誕生於2000年5月。 至今已經有14個年頭,SQLite也迎來了一個版本 SQLite 3已經發布。
根據SQLite的官方提示:http://www.sqlite.org/limits.html
SQLIte數據庫最大支持128TiB(140 terabytes, or 128 tebibytes, or 140,000 gigabytes or 128,000 gibibytes).
此外,關於性能。本人也在網上查了大量資料:
在2011年,有網友發表觀點:
“不得了了,在7G文件大小下,6千萬條記錄的有索引某個表中,查詢條件如果是索引字段,不管什么位置,查詢都不要1ms時間。”
“但如果查詢條件不是索引字段的話,最后一條記錄的查詢竟然需要589秒啊,不是ms啊。在1千萬條記錄前插入1百萬條記錄需要120秒,在6千萬條記錄后插入1百萬條記錄需要156秒。“
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(select count(*)from xxx),362058毫秒,約6分鍾,超級慢,這建議進行這種操作。