SQLite不同于其他大部分的SQL數(shù)據(jù)庫引擎,因?yàn)樗氖滓O(shè)計(jì)目標(biāo)就是簡單化:
l 易于管理
l 易于使用
l 易于嵌入其他大型程序
l 易于維護(hù)和配置
許多人喜歡SQLite因?yàn)樗男∏珊涂焖?span lang="EN-US">. 但是這些特性只是它的部分優(yōu)點(diǎn), 使用者還會發(fā)現(xiàn)SQLite是非常穩(wěn)定的. 出色的穩(wěn)定性源于它的簡單, 越簡單就越不容易出錯(cuò). 除了上述的簡單、小巧和穩(wěn)定性外, 最重要的在于SQLite力爭做到簡單化.
簡單化在一個(gè)數(shù)據(jù)庫引擎中可以說是一個(gè)優(yōu)點(diǎn), 但也可能是個(gè)缺點(diǎn), 主要決定于你想要做什么. 為了達(dá)到簡單化, SQLite省略了一些人們認(rèn)為比較有用的特性, 例如高并發(fā)性、 嚴(yán)格的存取控制、 豐富的內(nèi)置功能、 存儲過程、復(fù)雜的SQL語言特性、 XML以及Java的擴(kuò)展, 超大的萬億級別的數(shù)據(jù)測量等等. 如果你需要使用上述的這些特性并且不介意它們的復(fù)雜性, 那么SQLite也許就不適合你了. SQLite沒有打算作為一個(gè)企業(yè)級的數(shù)據(jù)庫引擎, 也并不打算和Oracle或者PostgreSQL競爭.
僅憑經(jīng)驗(yàn)來說SQLite適用于以下場合: 當(dāng)你更看中簡單的管理、使用和維護(hù)數(shù)據(jù)庫, 而不是那些企業(yè)級數(shù)據(jù)庫提供的不計(jì)其數(shù)的復(fù)雜功能的時(shí)候,使用SQLite是一個(gè)比較明智的選擇. 事實(shí)也證明, 人們在許多情況下已經(jīng)清楚的認(rèn)識到簡單就是最好的選擇.
SQLite最佳試用場合
l 網(wǎng)站
作為數(shù)據(jù)庫引擎SQLite適用于中小規(guī)模流量的網(wǎng)站(也就是說, 99.9%的網(wǎng)站). SQLite可以處理多少網(wǎng)站流量在于網(wǎng)站的數(shù)據(jù)庫有多大的壓力. 通常來說, 如果一個(gè)網(wǎng)站的點(diǎn)擊率少于100000次/天的話, SQLite是可以正常運(yùn)行的. 100000次/天是一個(gè)保守的估計(jì), 不是一個(gè)準(zhǔn)確的上限. 事實(shí)證明, 即使是10倍的上述流量的情況下SQLite依然可以正常運(yùn)行.
l 嵌入式設(shè)備和應(yīng)用軟件
因?yàn)?span lang="EN-US">SQLite數(shù)據(jù)庫幾乎不需要管理, 因此對于那些無人值守運(yùn)行或無人工技術(shù)支持的設(shè)備或服務(wù), SQLite是一個(gè)很好的選擇. SQLite能很好的適用于手機(jī), PDA, 機(jī)頂盒, 以及其他儀器. 作為一個(gè)嵌入式數(shù)據(jù)庫它也能夠很好的應(yīng)用于客戶端程序.
l 應(yīng)用程序文件格式
SQLite作為桌面應(yīng)用程序的本地磁盤文件格式取得了巨大成功.例如金融分析工具、CAD 包、檔案管理程序等等. 一般的數(shù)據(jù)庫打開操作需要調(diào)用sqlite3_open()函數(shù),并且標(biāo)記一個(gè)顯式本地事務(wù)的起始點(diǎn)(BEGIN TRANSACTION)來保證以獨(dú)占的方式得到文件的內(nèi)容. 文件保存將執(zhí)行一個(gè)提交(COMMIT)同時(shí)標(biāo)記另一個(gè)顯式本地事務(wù)起始點(diǎn). 這種事務(wù)處理的作用就是保證對于應(yīng)用程序數(shù)據(jù)文件的更新是原子的、持久的、獨(dú)立的和一致的.
數(shù)據(jù)庫里可以加入一些臨時(shí)的觸發(fā)器,用來把所有的改變記錄在一張臨時(shí)的取消/重做日志表中. 當(dāng)用戶按下取消/重做按鈕的時(shí)候這些改變將可以被回滾. 應(yīng)用這項(xiàng)技術(shù)實(shí)現(xiàn)一個(gè)無限級的取消/重做功能只需要編寫很少的代碼.
l 替代某些特別的文件格式
許多程序使用fopen(), fread(), 或 fwrite()函數(shù)創(chuàng)建和管理一些自定義的文件用來保存數(shù)據(jù). 使用SQLite替代這些自定義的文件格式將是一種很好的選擇.
l 內(nèi)部的或臨時(shí)的數(shù)據(jù)庫
對于那些有大量的數(shù)據(jù)需要用不同的方式篩選分類的程序, 相對于編寫同樣功能的代碼, 如果你把數(shù)據(jù)讀入一個(gè)內(nèi)存中的SQLite數(shù)據(jù)庫, 然后使用連接查詢和ORDER BY子句按一定的順序和排列提取需要的數(shù)據(jù), 通常會更簡單和快速. 按照上述的方法使用內(nèi)嵌的SQLite數(shù)據(jù)庫將會使程序更富有靈活性, 因?yàn)樘砑有碌牧谢蛩饕挥弥貙懭魏尾樵冋Z句.
l 命令行數(shù)據(jù)集分析工具
有經(jīng)驗(yàn)的SQL用戶可以使用SQLite命令行程序去分析各種混雜的數(shù)據(jù)集. 原是數(shù)據(jù)可以從CSV(逗號分隔值文件)文件中導(dǎo)入, 然后被切分產(chǎn)生無數(shù)的綜合數(shù)據(jù)報(bào)告. 可能得用法包括網(wǎng)站日志分析, 運(yùn)動(dòng)統(tǒng)計(jì)分析, 編輯規(guī)劃標(biāo)準(zhǔn), 分析試驗(yàn)結(jié)果.
當(dāng)然你也可以用企業(yè)級的客戶端/服務(wù)器數(shù)據(jù)庫來做同樣的事情. 在這種情況下使用SQLite的好處是: SQLite的部署更為簡單并且結(jié)果數(shù)據(jù)庫是一個(gè)單獨(dú)的文件, 你可以把它存儲在軟盤或者優(yōu)盤或者直接通過email發(fā)給同事.
l 在Demo或測試版的時(shí)候作為企業(yè)級數(shù)據(jù)庫的替代品
如果你正在編寫一個(gè)使用企業(yè)級數(shù)據(jù)庫引擎的客戶端程序, 使用一個(gè)允許你連接不同SQL數(shù)據(jù)庫引擎的通用型數(shù)據(jù)庫后臺將是很有意義的. 其更大的意義在于將SQLite數(shù)據(jù)庫引擎靜態(tài)的連接到客戶端程序當(dāng)中,從而內(nèi)嵌SQLite作為混合的數(shù)據(jù)庫支持. 這樣客戶端程序就可以使用SQLite數(shù)據(jù)庫文件做獨(dú)立的測試或者驗(yàn)證.
l 數(shù)據(jù)庫教學(xué)
因?yàn)?span lang="EN-US">SQLite的安裝和使用非常的簡單(安裝過程幾乎忽略不計(jì), 只需要拷貝SQLite源代碼或sqlite.exe可執(zhí)行文件到目標(biāo)主機(jī), 然后直接運(yùn)行就可以) 所以它非常適合用來講解SQL語句. 同學(xué)們可以非常簡單的創(chuàng)建他們喜歡的數(shù)據(jù)庫, 然后通過電子郵件發(fā)給老師批注或打分. 對于那些感興趣怎樣實(shí)現(xiàn)一個(gè)關(guān)系型數(shù)據(jù)庫管理系統(tǒng)(RDBMS)的高層次的學(xué)生, 按照模塊化設(shè)計(jì)且擁有很好的注釋和文檔的SQLite源代碼, 將為他們打下良好的基礎(chǔ). 這并不是說SQLite就是如何實(shí)現(xiàn)其他數(shù)據(jù)庫引擎的精確模型, 但是很適合學(xué)生們了解SQLite是如何快速工作的, 從而掌握其他數(shù)據(jù)庫系統(tǒng)的設(shè)計(jì)實(shí)現(xiàn)原則.
l 試驗(yàn)SQL語言的擴(kuò)展
SQLite簡單且模塊化的設(shè)計(jì)使得它可以成為一個(gè)用來測試數(shù)據(jù)庫語言特性或新想法的優(yōu)秀的原型平臺.
哪些場合適合使用其他的關(guān)系型數(shù)據(jù)庫管理系統(tǒng)(RDBMS)
l 客戶端/服務(wù)器程序
如果你有許多的客戶端程序要通過網(wǎng)絡(luò)訪問一個(gè)共享的數(shù)據(jù)庫, 你應(yīng)當(dāng)考慮用一個(gè)客戶端/服務(wù)器數(shù)據(jù)庫來替代SQLite. SQLite可以通過網(wǎng)絡(luò)文件系統(tǒng)工作, 但是因?yàn)楹痛蠖鄶?shù)網(wǎng)絡(luò)文件系統(tǒng)都存在延時(shí), 因此執(zhí)行效率不會很高. 此外大多數(shù)網(wǎng)絡(luò)文件系統(tǒng)在實(shí)現(xiàn)文件邏輯鎖的方面都存在著bug(包括Unix 和windows). 如果文件鎖沒有正常的工作, 就可能出現(xiàn)在同一時(shí)間兩個(gè)或更多的客戶端程序更改同一個(gè)數(shù)據(jù)庫的同一部分, 從而導(dǎo)致數(shù)據(jù)庫出錯(cuò). 因?yàn)檫@些問題是文件系統(tǒng)執(zhí)行的時(shí)候本質(zhì)上存在的bug, 因此SQLite沒有辦法避免它們.
好的經(jīng)驗(yàn)告訴我們, 應(yīng)該避免在許多計(jì)算機(jī)需要通過一個(gè)網(wǎng)絡(luò)文件系統(tǒng)同時(shí)訪問同一個(gè)數(shù)據(jù)庫的情況下使用SQLite.
l 高流量網(wǎng)站
SQLite通常情況下用作一個(gè)網(wǎng)站的后臺數(shù)據(jù)庫可以很好的工作. 但是如果你的網(wǎng)站的訪問量大到你開始考慮采取分布式的數(shù)據(jù)庫部署, 那么你應(yīng)當(dāng)毫不猶豫的考慮用一個(gè)企業(yè)級的客戶端/服務(wù)器數(shù)據(jù)庫來替代SQLite.
l 超大的數(shù)據(jù)集
當(dāng)你在SQLite中開始一個(gè)事務(wù)處理的時(shí)候(事務(wù)處理會在任何寫操作發(fā)生之前產(chǎn)生, 而不是必須要顯示的調(diào)用BEGIN...COMMIT), 數(shù)據(jù)庫引擎將不得不分配一小塊臟頁(文件緩沖頁面)來幫助它自己管理回滾操作. 每1MB的數(shù)據(jù)庫文件SQLite需要256字節(jié). 對于小型的數(shù)據(jù)庫這些空間不算什么, 但是當(dāng)數(shù)據(jù)庫增長到數(shù)十億字節(jié)的時(shí)候, 緩沖頁面的尺寸就會相當(dāng)?shù)拇罅?span lang="EN-US">. 如果你需要存儲或修改幾十GB的數(shù)據(jù), 你應(yīng)該考慮用其他的數(shù)據(jù)庫引擎.
l 高并發(fā)訪問
SQLite對于整個(gè)數(shù)據(jù)庫文件進(jìn)行讀取/寫入鎖定. 這意味著如果任何進(jìn)程讀取了數(shù)據(jù)庫中的某一部分, 其他所有進(jìn)程都不能再對該數(shù)據(jù)庫的任何部分進(jìn)行寫入操作. 同樣的, 如果任何一個(gè)進(jìn)程在對數(shù)據(jù)庫進(jìn)行寫入操作, 其他所有進(jìn)程都不能再讀取該數(shù)據(jù)庫的任何部分. 對于大多數(shù)情況這不算是什么問題. 在這些情況下每個(gè)程序使用數(shù)據(jù)庫的時(shí)間都很短暫, 并且不會獨(dú)占, 這樣鎖定至多會存在十幾毫秒. 但是如果有些程序需要高并發(fā), 那么這些程序就需要尋找其他的解決方案了.