SQLite入門一——SQLite概述


學習、掌握一門新的技術通常需要了解這門技術產生的背景,為什么需要這樣的技術,或者說能夠解決那些問題?

Ø SQLite概述

Ø SQLite特性

Ø 與其他數據庫比較

Ø 使用SQLite解決那些問題

SQLite概述

SQLite數據庫引擎具有獨立、無服務器端、零配置、支持事務等特點,作為一款優秀的開源嵌入式數據庫引擎,SQLite受到了很多知名企業及項目的使用。

SQLite是一款嵌入式數據庫引擎。與其他數據庫系統不同,SQLite沒有一個獨立的server進程,SQLite直接在文件系統上的數據庫文件進行讀寫操作,並且SQLite的數據庫文件具有很好的跨平台特性。

SQLite是一款輕量級的數據庫引擎。作為一款輕量級的數據庫引擎,SQLite最大也只會占用350K的內存,並且這與所使用平台以及編譯器的優化設置有關。SQLite可以在最小4K的堆棧空間和100K堆上運行。由於SQLite在運行時占用的資源較少,而且無需任何管理開銷,SQLite對小內存設備,如PDA、手機、MP3 等,SQLite的優勢毋庸置疑。盡管在可以在如此小的內存環境上運行,但SQLite仍然具有很好的性能。

SQLite主要定位就是靈巧、高效、穩定的數據庫,這種靈巧、高效、穩定的數據庫有其使用的場景。下面是SQLite的主要特征:

1. 管理簡單。

2. 操作方便。

3. 可以非常方便的嵌入其他應用程序。

4. 易於維護。

SQLite為了達到更加靈巧的目標,在功能上作出了很多關鍵性的取舍,失去了對一些RDBMS關鍵性功能的支持,如高並發、細粒度訪問控制(如行級鎖)、豐富的內置函數、存儲過程和復雜的SQL語句等。正是因為這些功能的取舍才換來了簡單靈巧,簡單靈巧又換來了高效性和高可靠性。

SQLite的主要特點:

1. 一致性的文件格式:

在SQLite的官方文檔中是這樣描述的,我們不要將SQLite與Oracle或PostgreSQL去比較,而是應該將它看做fopen和fwrite。與我們自定義格式的數據文件相比,SQLite不僅提供了很好的移植性,如大端小端、32/64位等平台相關問題,而且還提供了數據訪問的高效性,如基於某些信息建立索引,從而提高訪問或排序該類數據的性能,SQLite提供的事務功能,也是在操作普通文件時無法有效保證的。SQLite具有很好的向下兼容性,任何版本無需修改任何設置便可以讀取以前版本的SQLite數據庫文件。

2.零配置:

SQLite在使用之前無需安裝,也沒有安裝和卸載的過程,不需要啟動、停止或者配置服務器實例,因為SQLite根本沒有server process,采用的是in-process的方式。使用SQLite的時候也無需創建數據庫實例或者為用戶設置訪問權限。

3. 沒有獨立的服務器:

和其他關系型數據庫不同的是,SQLite沒有單獨的服務器進程,以供客戶端程序訪問並提供相關的服務。SQLite作為一種嵌入式數據庫,其運行環境與主程序位於同一進程空間,因此它們之間的通信完全是進程內通信,而相比於進程間通信,其效率更高。

然而需要特別指出的是,該種結構在實際運行時確實存在保護性較差的問題,比如此時,應用程序出現問題導致進程崩潰,由於SQLite與其所依賴的進程位於同一進程空間,那么此時SQLite也將隨之退出。但是對於獨立的服務器進程,則不會有此問題,它們將在密閉性更好的環境下完成它們的工作。

4. 單一磁盤文件:

SQLite的數據庫被存放在文件系統的單一磁盤文件內,只要有權限便可隨意訪問和拷貝,這樣帶來的主要好處是便於攜帶和共享。其他的數據庫引擎,基本都會將數據庫存放在一個磁盤目錄下,然后由該目錄下的一組文件構成該數據庫的數據文件。盡管我們可以直接訪問這些文件,但是我們的程序卻無法操作它們,只有數據庫實例進程才可以做到。這樣的好處是帶來了更高的安全性和更好的性能,但是也付出了安裝和維護復雜的代價。

5. 平台無關性:

這一點在前面已經解釋過了。和SQLite相比,很多數據庫引擎在備份數據時不能通過該方式直接備份,只能通過數據庫系統提供的各種dump和restore工具,將數據庫中的數據先導出到本地文件中,之后在load到目標數據庫中。這種方式存在顯而易見的效率問題,首先需要導出到另外一個文件,如果數據量較大,導出的過程將會比較耗時。然而這只是該操作的一小部分,因為數據導入往往需要更多的時間。數據在導入時需要很多的驗證過程,在存儲時,也並非簡簡單單的順序存儲,而是需要按照一定的數據結構、算法和策略存放在不同的文件位置。

因此和直接拷貝數據庫文件相比,其性能是非常拙劣的。

6.弱類型:

大部分數據庫使用靜態類型,靜態類型關聯到數據表中的每個列,只有該種類型的數據才被允許插入到該列中。與此不同的是SQLite通過弱類型相對放松了這種限制,SQLite中的數據類型被視為數值的一個屬性。因此對於一個數據表列而言,即便在聲明該表時給出了該列的類型,我們在插入數據時仍然可以插入任意類型,比如Integer的列被存入字符串'hello'。針對該特征唯一的例外是整型的主鍵列,我們只能在該列中存儲整型數據。

7.SQL語句編譯成虛擬機代碼:

很多數據庫產品會將SQL語句解析成復雜的,相互嵌套的數據結構,之后再交予執行器遍歷該數據結構完成指定的操作。相比於此,SQLite會將SQL語句先編譯成字節碼,之后再交由其自帶的虛擬機去執行。該方式提供了更好的性能和更出色的調試能力。

SQLite應用場景:

1. 在嵌入式或移動設備上的應用:

由於SQLite在運行時占用的資源較少,而且無需任何管理開銷,因此對於PDA、智能手機等移動設備來說,SQLite的優勢毋庸置疑。

3. 數據分析:

可以充分利用SQLite提供SQL特征,完成簡單的數據統計分析的功能。這一點是CSV文件無法比擬的。

4. 產品Demo和測試:

在需要給客戶進行Demo時,可以使用SQLite作為我們的后台數據庫,和其他關系型數據庫相比,更加靈巧簡單的SQLite減少了大量的系統部署時間。對於產品的功能性測試而言,SQLite也可以起到相同的作用。

三、和RDBMS相比SQLite的一些劣勢:

1. C/S應用:

如果你有多個客戶端需要同時訪問數據庫中的數據,特別是他們之間的數據操作是需要通過網絡傳輸來完成的。在這種情況下,不應該選擇SQLite。由於SQLite的數據管理機制更多的依賴於OS的文件系統,因此在這種操作下其效率較低。

2. 數據量較大:

受限於操作系統的文件系統,在處理大數據量時,其效率較低。對於超大數據量的存儲,甚至不能提供支持。

3. 高並發:

由於SQLite僅僅提供了粒度很粗的數據鎖,如讀寫鎖,因此在每次加鎖操作中都會有大量的數據被鎖住,即使僅有極小部分的數據會被訪問。換句話說,我們可以認為SQLite只是提供了表級鎖,沒有提供行級鎖。在這種同步機制下,並發性能很難高效。

參考資料:

http://www.sqlite.org/whentouse.html#appfileformat

http://baike.baidu.com/view/19310.htm

部分來源於網絡。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM