一、簡介:
SQLite是目前最流行的開源嵌入式資料庫,和很多其他嵌入式存儲引擎相比(NoSQL),如BerkeleyDB、MemBASE等,SQLite可以很好的支援關系型資料庫所具備的一些基本特征,如标準SQL文法、事務、資料表和索引等。事實上,盡管SQLite擁有諸多關系型資料庫的基本特征,然而由于應用場景的不同,它們之間并沒有更多的可比性。下面我們将列舉一下SQLite的主要特征:
1). 管理簡單,甚至可以認為無需管理。
2). 操作友善,SQLite生成的資料庫檔案可以在各個平台無縫移植。
3). 可以非常友善的以多種形式嵌入到其他應用程式中,如靜态庫、動态庫等。
4). 易于維護。
綜上所述,SQLite的主要優勢在于靈巧、快速和可靠性高。SQLite的設計者們為了達到這一目标,在功能上作出了很多關鍵性的取舍,與此同時,也失去了一些對RDBMS關鍵性功能的支援,如高并發、細粒度通路控制(如行級鎖)、豐富的内置函數、存儲過程和複雜的SQL語句等。正是因為這些功能的犧牲才換來了簡單,而簡單又換來了高效性和高可靠性。
二、SQLite的主要優點:
1. 一緻性的檔案格式:
在SQLite的官方文檔中是這樣解釋的,我們不要将SQLite與Oracle或PostgreSQL去比較,而是應該将它看做fopen和fwrite。與我們自定義格式的資料檔案相比,SQLite不僅提供了很好的移植性,如大端小端、32/64位等平台相關問題,而且還提供了資料通路的高效性,如基于某些資訊建立索引,進而提高通路或排序該類資料的性能,SQLite提供的事務功能,也是在操作普通檔案時無法有效保證的。
2. 在嵌入式或移動裝置上的應用:
由于SQLite在運作時占用的資源較少,而且無需任何管理開銷,是以對于PDA、智能手機等移動裝置來說,SQLite的優勢毋庸置疑。
3. 内部資料庫:
在有些應用場景中,我們需要為插入到資料庫伺服器中的資料進行資料過濾或資料清理,以保證最終插入到資料庫伺服器中的資料有效性。有的時候,資料是否有效,不能通過單一一條記錄來進行判斷,而是需要和之前一小段時間的曆史資料進行特殊的計算,再通過計算的結果判斷目前的資料是否合法。在這種應用中,我們可以用SQLite緩沖這部分曆史資料。還有一種簡單的場景也适用于SQLite,即統計資料的預計算。比如我們正在運作資料實時采集的服務程式,我們可能需要将每10秒的資料彙總後,形成每小時的統計資料,該統計資料可以極大的減少使用者查詢時的資料量,進而大幅提高前端程式的查詢效率。在這種應用中,我們可以将1小時内的采集資料均緩存在SQLite中,在達到整點時,計算緩存資料後清空該資料。
4. 資料分析:
可以充分利用SQLite提供SQL特征,完成簡單的資料統計分析的功能。這一點是CSV檔案無法比拟的。
5. 産品Demo和測試:
在需要給客戶進行Demo時,可以使用SQLite作為我們的背景資料庫,和其他關系型資料庫相比,使用SQLite減少了大量的系統部署時間。對于産品的功能性測試而言,SQLite也可以起到相同的作用。
三、和RDBMS相比SQLite的一些劣勢:
1. C/S應用:
如果你有多個用戶端需要同時通路資料庫中的資料,特别是他們之間的資料操作是需要通過網絡傳輸來完成的。在這種情況下,不應該選擇SQLite。由于SQLite的資料管理機制更多的依賴于OS的檔案系統,是以在這種操作下其效率較低。
2. 資料量較大:
受限于作業系統的檔案系統,在處理大資料量時,其效率較低。對于超大資料量的存儲,甚至不能提供支援。
3. 高并發:
由于SQLite僅僅提供了粒度很粗的資料鎖,如讀寫鎖,是以在每次加鎖操作中都會有大量的資料被鎖住,即使僅有極小部分的資料會被通路。換句話說,我們可以認為SQLite隻是提供了表級鎖,沒有提供行級鎖。在這種同步機制下,并發性能很難高效。
四、個性化特征:
1. 零配置:
SQLite本身并不需要任何初始化配置檔案,也沒有安裝和解除安裝的過程。當然也不存在伺服器執行個體的啟動和停止。在使用的過程中,也無需建立使用者和劃分權限。在系統出現災難時,如電源問題、主機問題等,對于SQLite而言,不需要做任何操作。
2. 沒有獨立的伺服器:
和其他關系型資料庫不同的是,SQLite沒有單獨的伺服器程序,以供用戶端程式通路并提供相關的服務。SQLite作為一種嵌入式資料庫,其運作環境與主程式位于同一程序空間,是以它們之間的通信完全是程序内通信,而相比于程序間通信,其效率更高。然而需要特别指出的是,該種結構在實際運作時确實存在保護性較差的問題,比如此時,應用程式出現問題導緻程序崩潰,由于SQLite與其所依賴的程序位于同一程序空間,那麼此時SQLite也将随之退出。但是對于獨立的伺服器程序,則不會有此問題,它們将在密閉性更好的環境下完成它們的工作。
3. 單一磁盤檔案:
SQLite的資料庫被存放在檔案系統的單一磁盤檔案内,隻要有權限便可随意通路和拷貝,這樣帶來的主要好處是便于攜帶和共享。其他的資料庫引擎,基本都會将資料庫存放在一個磁盤目錄下,然後由該目錄下的一組檔案構成該資料庫的資料檔案。盡管我們可以直接通路這些檔案,但是我們的程式卻無法操作它們,隻有資料庫執行個體程序才可以做到。這樣的好處是帶來了更高的安全性和更好的性能,但是也付出了安裝和維護複雜的代價。
4. 平台無關性:
這一點在前面已經解釋過了。和SQLite相比,很多資料庫引擎在備份資料時不能通過該方式直接備份,隻能通過資料庫系統提供的各種dump和restore工具,将資料庫中的資料先導出到本地檔案中,之後在load到目标資料庫中。這種方式存在顯而易見的效率問題,首先需要導出到另外一個檔案,如果資料量較大,導出的過程将會比較耗時。然而這隻是該操作的一小部分,因為資料導入往往需要更多的時間。資料在導入時需要很多的驗證過程,在存儲時,也并非簡簡單單的順序存儲,而是需要按照一定的資料結構、算法和政策存放在不同的檔案位置。是以和直接拷貝資料庫檔案相比,其性能是非常拙劣的。
5. 弱類型:
和大多數支援靜态類型的資料庫不同的是,SQLite中的資料類型被視為數值的一個屬性。是以對于一個資料表列而言,即便在聲明該表時給出了該列的類型,我們在插入資料時仍然可以插入任意類型,比如Integer的列被存入字元串'hello'。針對該特征唯一的例外是整型的主鍵列,對于此種情況,我們隻能在該列中存儲整型資料。
6. SQL語句編譯成虛拟機代碼:
很多資料庫産品會将SQL語句解析成複雜的,互相嵌套的資料結構,之後再交予執行器周遊該資料結構完成指定的操作。相比于此,SQLite會将SQL語句先編譯成位元組碼,之後再交由其自帶的虛拟機去執行。該方式提供了更好的性能和更出色的調試能力。