SQLite3 介紹


什么是 SQLite

       SQLite是一款輕量級的、基於文件的嵌入式數據庫,實現自包容、零配置、支持事務的SQL數據庫引擎。與其他數據庫管理系統不同,SQLite 的安裝和運行非常簡單,在大多數情況下,只要確保SQLite的二進制文件存在即可開始創建、連接和使用數據庫。第一個Alpha版本誕生於2000年5月,直到今天已經成為最流行的嵌入式數據庫,包括Google在內的許多公司在其桌面軟件中亦使用SQLite存儲用戶數據,由此看來,其穩定性毋庸置疑。

       實際應用中,SQLite作為目前最為流行的開源嵌入式關系型數據庫,在系統的架構設計中正扮演着越來越重要的角色。和很多其它嵌入式NoSQL數據庫(如BerkeleyDB、MemBASE等)不同的是,SQLite支持很多關系型數據庫的基本特征,如標准SQL語法、事務、數據表和索引等,這在數據移植、程序演示等應用中有着不可替代的優勢。從官方文檔中我們可以獲悉到,SQLite支持的數據量和運行效率都是非常驕人的,因此在海量數據的解決方案中,SQLite可以作為數據預計算的橋頭堡,從而顯著減少存儲在關系型數據庫服務器中的數據數量,最終提高系統的查詢效率和運行期效率,同時也可以顯著的降低數據備份的磁盤開銷。

SQLite的主要特征:
    1). 管理簡單,甚至可以認為無需管理。
    2). 操作方便,SQLite生成的數據庫文件可以在各個平台無縫移植。
    3). 可以非常方便的以多種形式嵌入到其他應用程序中,如靜態庫、動態庫等。
    4). 易於維護。

  綜上所述,SQLite的主要優勢在於靈巧、快速和可靠性高。SQLite的設計者們為了達到這一目標,在功能上作出了很多關鍵性的取舍,與此同時,也失去了一些對RDBMS關鍵性功能的支持,如高並發、細粒度訪問控制(如行級鎖)、豐富的內置函數、存儲過程和復雜的SQL語句等。正是因為這些功能的犧牲才換來了簡單,而簡單又換來了高效性和高可靠性。

SQLite的優勢

  ①   免配置。和Access一樣,只要把數據庫文件通過FTP上傳到服務器上即可使用,不需要服務器的額外支持。

  ②   備份方便。因為只是一個文件,只要復制一份該文件,就能備份整個數據庫。

  ③   雖然是輕量級數據庫。但最大能支持2TB 大小的單個庫文件。

  ④   速度快。在幾百萬條記錄的情況下,其插入和查詢速度與MySQL不分上下,快於SQL Server,10倍於Access(但這並不意味着它可以替代SQL Server)。

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只是提供了表級鎖,沒有提供行級鎖。在這種同步機制下,並發性能很難高效。

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語句先編譯成字節碼,之后再交由其自帶的虛擬機去執行。該方式提供了更好的性能和更出色的調試能力。

SQLite安裝

SQLite on Windows

1)進入 SQL 下載頁面:http://www.sqlite.org/download.html

2)下載 Windows 下的預編譯二進制文件包:

sqlite-shell-win32-x86-<build#>.zip
sqlite-dll-win32-x86-<build#>.zip

(注意: <build#> 是 sqlite 的編譯版本號)

  • 下載 sqlite-shell-win32-*.zip 和 sqlite-dll-win32-*.zip 壓縮文件。
  • 創建文件夾sqlite,並在此文件夾下解壓上面兩個壓縮文件,將得到 sqlite3.def、sqlite3.dll 和 sqlite3.exe 文件。
  • 添加sqlite 到 PATH 環境變量,以方便在命令行中執行 sqlite 命令。

 可選: 如果你計划發布基於 sqlite 數據庫的應用程序,你還需要下載源碼以便編譯和利用其 API。

sqlite-amalgamation-<build#>.zip

SQLite源碼下載

在SQLITE主頁https://www.sqlite.org/download.html下載源碼,選擇出現以下字樣的ZIP文件進行下載。

SQLite編譯

    若要編譯SQLite庫,需要下載單一文件版本sqlite-amalgamation-3071400.zip。它把sqlite3庫的所有源碼文件內容放到一個文件sqlite3.c中了(不包含管理工具shell.c),這個文件大概有110000多行,如果除去空白行和注釋,則有65000多行的代碼!這樣做的好處是很容易應用在你的項目中,只需拷貝這一個源文件到你項目中即可。另外,編譯器在編譯單一的文件時能做一些額外的優化,因為只有一個編譯單元。通過測試發現大概有5%-10%的性能提升。
    SQLite庫可以不編譯,直接把單一文件sqlite3.c(或者再加上sqlite3.h)拷貝到你的項目中使用即可。但作為一個單獨的庫,一般建議編譯成獨立的二進制文件格式的庫,如Linux下的.so動態鏈接庫,Windows下的DLL動態鏈接庫,然后在項目中通過頭文件sqlite3.h來使用這個庫,這樣能使軟件更加地模塊化。


免責聲明!

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



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