SQLite剖析之功能特性

  SQLite是遵照ACID的輕型數據庫引擎,它包含在一個相對較小的C庫中。它是D.RichardHipp建立的公有領域項目。不像常見的客戶端/服務器結構範例,SQLite引擎不是一個與程序通訊的獨立進程,而是鏈接到程序中成爲它的一個主要部分。因此主要的通訊協議是在編程語言內的直接API調用。這在消耗總量、延遲時間和總體簡單性上有積極的做用。整個數據庫(定義、表、索引和數據自己)都在宿主主機上存儲在一個單一的文件中。其簡單的設計是經過在開始一個事務的時候鎖定整個數據文件而完成的。程序員

1、特性
    (1)支持原子的、一致的、獨立和持久 (ACID) 的事務,即便在系統崩潰或電源斷電後也能保持數據完整性。
    (2)零配置 – 無需安裝和管理配置。
    (3)實現多數SQL92標準(但不是所有)。對SQL92標準的支持包括ACID事務、索引、約束、觸發和查看等。不支持外鍵約束,受權和收回權限等。
    (4)一個完整的數據庫存儲在單一的跨平臺的文件中。
    (5)支持2TB大小的數據庫和GB級大小的字符串和二進制對象。
    (6)足夠小,到3.7.14版忽略掉註釋大約6.5萬行代碼。
    (7)對大部分普通的數據庫操做,比不少流行的客戶/服務器模式的數據庫都要快。
    (8)簡單、易使用的API。
    (9)使用ANSI-C編寫。支持大多數語言的綁定,如C++, PHP, Python, Perl, Java, C#, Tcl, Rails, Delphi, COM/VB DLL, Objective-C等等,還有ODBC接口。
    (10)良好註釋的源代碼,而且有着100%的測試覆蓋率。
    (11)全部源代碼包含在一個單一的ANSI-C源文件中,很容易嵌入到項目中。
    (12)自包含:沒有外部依賴。
    (13)跨平臺:支持Unix(Linux, Mac OS-X, Android, iOS),Windows(Win32, WinCE, WinRT),也很容易移植到其餘系統上。
    (14)源代碼屬於公有領域,可用於任何用途,包括商業應用。
    (15)附帶一個管理SQLite數據庫的命令行工具。
  SQLite的數據庫權限只依賴於文件系統,沒有用戶賬戶的概念。SQLite有數據庫級鎖定,沒有網絡服務器,而且能夠實現多數SQL92標準(但不是所有)。SQL92標準的其餘一些主要功能是外鍵和檢查限制。SQLite經過數據庫級上的獨佔性和共享鎖定來實現獨立事務處理。這意味着多個進程和線程能夠在同一時間從同一數據庫讀取數據,但只有一個能夠寫入數據。在某個進程或線程向數據庫執行寫入操做以前,必須得到獨佔鎖定。在發出獨佔鎖定後,其餘的讀或寫操做將不會再發生。
  SQLite的設計目標是嵌入式的,並且目前已經在不少嵌入式產品中使用了它,它佔用資源率很是低,在嵌入式設備中,可能只需幾百K的內存就足夠。目前SQLite被普遍地用於多個產品,包括Adobe Photoshop, Airbus, Dropbox, Firefox, Thunderbird, Flame, Google的不少項目,McAfree,Microsoft的遊戲項目,PHP語言,Python語言,Skype,Toshiba的不少項目,等等。
  SQLite還很是健壯,其建立者保守地估計SQLite能夠處理天天負擔多達10000次點擊率的Web站點,而且SQLite有時候能夠處理10倍於上述數字的負載。sql


2、數據類型
  SQLite是無類型(Typelessness)的,這意味着你能夠保存任何類型的數據到你所想要保存的任何表的任何列中,不管這列聲明的數據類型是什麼,對於SQLite來講對字段不指定類型是徹底有效的(只有在一種狀況下不是,即在字段類型爲」Integer Primary Key」時)。如:
  Create Table ex1(a, b, c);
  實際上SQLite不支持靜態數據類型,而是使用列關係。這意味着它的數據類型不具備表列屬性,而具備數據自己的屬性。當某個值插入數據庫時,SQLite將檢查它的類型。若是該類型與關聯的列不匹配,則SQLite會嘗試將該值轉換成列類型。若是不能轉換,則該值將做爲其自己具備的類型存儲。
  誠然SQLite容許忽略數據類型,可是仍然建議在你的Create Table語句中指定數據類型。由於數據類型對於你和其餘的程序員交流,或者你準備換掉你的數據庫引擎時能起到一個提示或幫助的做用。 SQLite支持常見的數據類型,包括NULL、INTEGER、REAL、TEXT和BLOB數據類型。如: 數據庫

CREATE TABLE ex2(  
  a VARCHAR(10),  
  b NVARCHAR(15),  
  c TEXT,  
  d INTEGER,  
  e FLOAT,  
  f BOOLEAN,  
  g CLOB,  
  h BLOB,  
  i TIMESTAMP,  
  j NUMERIC(10,5)  
  k VARYING CHARACTER (24),  
  l NATIONAL VARYING CHARACTER(16)  
);   

 

3、功能
    SQLite雖然很小巧,可是支持的SQL語句不會遜色於其餘開源數據庫,它支持的SQL包括:express

aggregate functions: avg(X), count(X), count(*), group_concat(X), group_concat(X,Y), max(X), min(X), sum(X), total(X).
ALTER TABLE
ANALYZE
ATTACH DATABASE
BEGIN TRANSACTION
comment
COMMIT TRANSACTION
core functions: abs(X), changes(), coalesce(X,Y,...), glob(X,Y), ifnull(X,Y), hex(X), last_insert_rowid(), length(X), like(X,Y), like(X,Y,Z), load_extension(X), load_extension(X,Y), lower(X), ltrim(X), ltrim(X,Y), max(X,Y,...), min(X,Y,...), nullif(X,Y), quote(X), random(), randomblob(N), replace(X,Y,Z), round(X), round(X,Y), rtrim(X), rtrim(X,Y), soundex(X), sqlite_compileoption_get(N), sqlite_compileoption_used(X), sqlite_source_id(), sqlite_version(), substr(X,Y,Z), substr(X,Y), total_changes(), trim(X), trim(X,Y), typeof(X), upper(X), zeroblob(N).
CREATE INDEX
CREATE TABLE
CREATE TRIGGER
CREATE VIEW
CREATE VIRTUAL TABLE
date and time functions: date(), time(), datetime(), julianday(), strftime().
DELETE
DETACH DATABASE
DROP INDEX
DROP TABLE
DROP TRIGGER
DROP VIEW
END TRANSACTION
EXPLAIN
expression
INDEXED BY    
INSERT
keywords
ON CONFLICT clause
PRAGMA
REINDEX
RELEASE SAVEPOINT
REPLACE
ROLLBACK TRANSACTION
SAVEPOINT
SELECT
UPDATE
VACUUM

    同時它還支持事務處理功能等等。某種程度上SQLite有點像Microsoft的Access,都是文件型數據庫,一個數據庫就是一個文件,在這個文件中可創建多張表,能夠創建索引、觸發器等。備份這個文件就備份了整個數據庫。可是,SQLite支持跨平臺,操做簡單,可以使用不少語言直接建立數據庫,而不像Access須要Office的支持。編程

 

4、管理SQLite安全

  SQLite附帶一個命令行管理工具。經過數據庫名稱能夠調用此命令行程序,而且能夠按照下面的方式建立新的數據庫和表服務器

C:\Users\Kim>sqlite3 alf.db  
SQLite version <%版本號%> 2016-08-28 20:11:36  
Enter ".help" for instructions  
Enter SQL statements terminated with a ";"  
sqlite> .tables  
sqlite> create table mytable(name varchar(40), age smallint);  
sqlite> insert into mytable values('Jack-Zhou', 23);  
sqlite> select * from mytable;  
Jack-Zhou|23  
sqlite> .tables  
mytable  
sqlite> .schema  
CREATE TABLE mytable(name varchar(40), age smallint);  
sqlite>  

  上面建立一個alf數據庫,在其中建立一個表mytable,插入一條數據;然後列出數據庫中的全部表和模式。
  SQLite還附帶一個命令行數據庫分析器,該分析器容許您顯示關於任何SQLite數據庫當前狀態的詳細信息網絡

C:\Users\Kim>sqlite3_analyzer alf.db  
/** Disk-Space Utilization Report For alf.db  
  
Page size in bytes.................... 1024  
Pages in the whole file (measured).... 2  
Pages in the whole file (calculated).. 2  
Pages that store data................. 2          100.0%  
Pages on the freelist (per header).... 0            0.0%  
Pages on the freelist (calculated).... 0            0.0%  
Pages of auto-vacuum overhead......... 0            0.0%  
Number of tables in the database...... 2  
Number of indices..................... 0  
Number of named indices............... 0  
Automatically generated indices....... 0  
Size of the file in bytes............. 2048  
Bytes of user payload stored.......... 13           0.63%  
  
*** Page counts for all tables with their indices ********************  
  
MYTABLE............................... 1           50.0%  
SQLITE_MASTER......................... 1           50.0%  
  
*** All tables *******************************************************  
  
Percentage of total database.......... 100.0%  
Number of entries..................... 2  
Bytes of storage consumed............. 2048  
Bytes of payload...................... 91           4.4%  
Average payload per entry............. 45.50  
Average unused bytes per entry........ 916.50  
Fragmentation.........................   0.0%  
Maximum payload per entry............. 78  
Entries that use overflow............. 0            0.0%  
Primary pages used.................... 2  
Overflow pages used................... 0  
Total pages used...................... 2  
Unused bytes on primary pages......... 1833        89.5%  
Unused bytes on overflow pages........ 0  
Unused bytes on all pages............. 1833        89.5%  
  
*** Table MYTABLE ****************************************************  
  
Percentage of total database..........  50.0%  
Number of entries..................... 1  
Bytes of storage consumed............. 1024  
Bytes of payload...................... 13           1.3%  
Average payload per entry............. 13.00  
Average unused bytes per entry........ 999.00  
Maximum payload per entry............. 13  
Entries that use overflow............. 0            0.0%  
Primary pages used.................... 1  
Overflow pages used................... 0  
Total pages used...................... 1  
Unused bytes on primary pages......... 999         97.6%  
Unused bytes on overflow pages........ 0  
Unused bytes on all pages............. 999         97.6% 

  因爲徹底可以使用命令行界面來管理數據庫,所以它能夠爲數據庫管理員帶來很大的方便。固然還有許多優秀的第三方SQLite管理工具,如基於QT的SQLiteMan,Firefox插件SQLite Manager,SQLiteSpy等等。架構

  另外,備份SQLite數據庫有兩種方法。若是數據庫沒有處於使用狀態,則能夠直接將數據庫文件複製到安全位置;若是數據庫正在使用中,則應從命令行界面使用.dump命令(.dump命令也能夠用於備份數據庫表),建立一個包含必要命令和數據的文件,從而從新建立數據庫:併發

C:\Users\Kim>sqlite3 alf.db  
SQLite version 3.7.14 2012-09-03 15:42:36  
Enter ".help" for instructions  
Enter SQL statements terminated with a ";"  
sqlite> .dump  
PRAGMA foreign_keys=OFF;  
BEGIN TRANSACTION;  
CREATE TABLE mytable(name varchar(40), age smallint);  
INSERT INTO "mytable" VALUES('Jack-Zhou',23);  
COMMIT;  
sqlite>

 

5、不支持的SQL特性
  相對於試圖列出SQLite支持的全部SQL92特性,只列出不支持的部分要簡單得多。下面列出的就是SQLite所不支持的SQL92特性(按列表的順序關係,接近列表頂部的特性更可能在不遠的未來加入):
    (1)RIGHT OUTER JOIN和FULL OUTER JOIN:已經實現了LEFT OUTER JOIN,但還沒實現RIGHT OUTER JOIN和FULL OUTER JOIN。
    (2)完整的ALTER TABLE支持:只支持ALTER TABLE命令的RENAME TABLE和ADD COLUMN操做。 其餘ALTER TABLE操做如DROP COLUMN、ALTER COLUMN、ADD CONSTRAINT等等均被忽略。
    (3)完整的觸發器支持:支持FOR EACH ROW觸發器,但不支持FOR EACH STATEMENT觸發器。
    (4)可寫視圖:SQLite中的視圖是隻讀的。你不能夠在視圖上執行DELETE、INSERT或UPDATE。可是你能夠建立一個試圖在視圖上DELETE、INSERT、UPDATE時觸發的觸發器,而後在觸發器中完成你所須要的工做。
    (5)GRANT和REVOKE:因爲SQLite讀和寫的是一個普通的磁盤文件,所以惟一能夠獲取的權限就是操做系統的標準文件訪問權限。通常在客戶機/服務器架構的關係型數據庫系統上能找到的GRANT和REVOKE命令,但對於一個嵌入式數據庫引擎來講是沒有意義的,所以沒有實現。


6、應用場合
    SQLite不一樣於其餘大部分的SQL數據庫引擎,由於它的首要設計目標就是簡單化:
    * 易於管理
    * 易於使用
    * 易於嵌入其餘大型程序
    * 易於維護和配置
    許多人喜歡SQLite就是由於它的小巧和快速。可是這些特性只是它的部分優勢,使用者還會發現SQLite是很是穩定的。出色的穩定性源於它的簡單,越簡單就越不容易出錯。除了上述的簡單、小巧和穩定性外,最重要的在於SQLite力爭作到簡單化。
    簡單化在一個數據庫引擎中能夠說是一個優勢,但也多是個缺點,主要決定於你想要作什麼。爲了達到簡單化,SQLite省略了一些人們認爲比較有用的特性,例如高併發性、嚴格的存取控制、豐富的內置功能、存儲過程、複雜的SQL語言特性、XML以及Java的擴展、超大的萬億級別的數據測量等等。若是你須要使用上述的這些特性而且不介意它們的複雜性,那麼SQLite也許就不適合你了。SQLite沒有打算做爲一個企業級的數據庫引擎,也並不打算和Oracle或者PostgreSQL競爭。
    僅憑經驗來講SQLite適用於如下場合:當你更看中簡單的管理、使用和維護數據庫,而不是那些企業級數據庫提供的不可勝數的複雜功能的時候,使用SQLite是一個比較明智的選擇。事實也證實,人們在許多狀況下已經清楚的認識到簡單就是最好的選擇。
    SQLite最佳試用場合:
    (1)應用程序文件格式
    SQLite做爲桌面應用程序的本地磁盤文件格式取得了巨大成功。例如金融分析工具、CAD包、檔案管理程序等等。通常的數據庫打開操做須要調用sqlite3_open()函數,而且標記一個顯式本地事務的起始點(BEGIN TRANSACTION)來保證以獨佔的方式獲得文件的內容。文件保存將執行一個提交(COMMIT)同時標記另外一個顯式本地事務起始點。這種事務處理的做用就是保證對於應用程序數據文件的更新是原子的、持久的、獨立的和一致的。
    數據庫裏能夠加入一些臨時的觸發器,用來把全部的改變記錄在一張臨時的取消/重作日誌表中。當用戶按下取消/重作按鈕的時候這些改變將能夠被回滾。這項技術實現一個無限級的取消/重作功能只須要編寫不多的代碼。
    (2)嵌入式設備和應用軟件
    由於SQLite數據庫幾乎不須要管理,所以對於那些無人值守運行或無人工技術支持的設備或服務,SQLite是一個很好的選擇。SQLite能很好的適用於手機、PDA、機頂盒,以及其餘儀器。做爲一個嵌入式數據庫它也可以很好的應用於客戶端程序。
    (3)網站
    做爲數據庫引擎SQLite適用於中小規模流量的網站(也就是說99.9%的網站)。SQLite能夠處理多少網站流量在於網站的數據庫有多大的壓力。一般來講,若是一個網站的點擊率少於100000次/天的話,SQLite是能夠正常運行的。100000次/天是一個保守的估計,不是一個準確的上限。事實證實,即便是10倍的上述流量的狀況下SQLite依然能夠正常運行。
    (4)替代某些特別的文件格式
    許多程序使用fopen()、fread()或fwrite()函數建立和管理一些自定義的文件用來保存數據。使用SQLite替代這些自定義的文件格式將是一種很好的選擇。
    (5)內部的或臨時的數據庫
    對於那些有大量的數據須要用不一樣的方式篩選分類的程序,相對於編寫一樣功能的代碼,若是你把數據讀入一個內存中的SQLite數據庫,而後使用鏈接查詢和ORDER BY子句按必定的順序和排列提取須要的數據,一般會更簡單和快速。按照上述的方法使用內嵌的SQLite數據庫將會使程序更富有靈活性,由於添加新的列或索引不用重寫任何查詢語句。
    (6)命令行數據集分析工具
    有經驗的SQL用戶可使用SQLite命令行程序去分析各類混雜的數據集。原始數據能夠從CSV文件(逗號分隔值文件)中導入,而後被切分產生無數的綜合數據報告。可能的用法包括網站日誌分析、運動統計分析、編輯規劃標準、分析試驗結果。
    固然也能夠用企業級的客戶端/服務器數據庫來作一樣的事情。在這種狀況下使用SQLite的好處是:SQLite的部署更爲簡單而且結果數據庫是一個單獨的文件,你能夠把它存儲在軟盤或者優盤或者直接經過email發給同事。
    (7)在Demo或測試版的時候做爲企業級數據庫的替代品
    若是你正在編寫一個使用企業級數據庫引擎的客戶端程序,使用一個容許你鏈接不一樣SQL數據庫引擎的通用型數據庫後臺將是頗有意義的。其更大的意義在於將SQLite數據庫引擎靜態的鏈接到客戶端程序當中,從而內嵌SQLite做爲混合的數據庫支持。這樣客戶端程序就可使用SQLite數據庫文件作獨立的測試或者驗證。
    (8)數據庫教學
    由於SQLite的安裝和使用很是的簡單(安裝過程幾乎忽略不計,只須要拷貝SQLite源代碼或sqlite.exe可執行文件到目標主機,而後直接運行就能夠),因此它很是適合用來說解SQL語句。同窗們能夠很是簡單地建立他們喜歡的數據庫,而後經過電子郵件發給老師批註或打分。對於那些感興趣怎樣實現一個關係型數據庫管理系統(RDBMS)的高層次的學生, 按照模塊化設計且擁有很好的註釋和文檔的SQLite源代碼,將爲他們打下良好的基礎。這並非說SQLite就是如何實現其餘數據庫引擎的精確模型,可是很適合學生們瞭解SQLite是如何快速工做的,從而掌握其餘數據庫系統的設計實現原則。
    (9)試驗SQL語言的擴展
    SQLite簡單且模塊化的設計使得它能夠成爲一個用來測試數據庫語言特性或新想法的優秀的原型平臺。 

   
7、哪些場合適合使用其餘的關係型數據庫管理系統(RDBMS)
    (1)客戶端/服務器程序
  若是你有許多的客戶端程序要經過網絡訪問一個共享的數據庫,你應當考慮用一個客戶端/服務器數據庫來替代SQLite。SQLite能夠經過網絡文件系統工做,可是由於和大多數網絡文件系統都存在延時,所以執行效率不會很高。此外大多數網絡文件系統在實現文件邏輯鎖的方面都存在着bug(包括Unix和Windows)。若是文件鎖沒有正常的工做,就可能出如今同一時間兩個或更多的客戶端程序更改同一個數據庫的同一部分,從而致使數據庫出錯。由於這些問題是文件系統執行的時候本質上存在的bug,所以SQLite沒有辦法避免它們。
  好的經驗告訴咱們,應該避免在許多計算機須要經過一個網絡文件系統同時訪問同一個數據庫的狀況下使用SQLite。
    (2)高流量網站
  SQLite一般狀況下用做一個網站的後臺數據庫能夠很好的工做。可是若是你的網站的訪問量大到你開始考慮採起分佈式的數據庫部署,那麼你應當絕不猶豫的考慮用一個企業級的客戶端/服務器數據庫來替代SQLite。
    (3)超大的數據集
  當你在SQLite中開始一個事務處理的時候(事務處理會在任何寫操做發生以前產生,而不是必需要顯示的調用BEGIN...COMMIT),數據庫引擎將不得不分配一小塊髒頁(文件緩衝頁面)來幫助它本身管理回滾操做。每1MB的數據庫文件SQLite須要256字節。對於小型的數據庫這些空間不算什麼,可是當數據庫增加到數十億字節的時候,緩衝頁面的尺寸就會至關的大了。若是你須要存儲或修改幾十GB的數據,你應該考慮用其餘的數據庫引擎。
    (4)高併發訪問  SQLite對於整個數據庫文件進行讀取/寫入鎖定。這意味着若是任何進程讀取了數據庫中的某一部分,其餘全部進程都不能再對該數據庫的任何部分進行寫入操做。一樣的,若是任何一個進程在對數據庫進行寫入操做,其餘全部進程都不能再讀取該數據庫的任何部分。對於大多數狀況這不算是什麼問題,在這些狀況下每一個程序使用數據庫的時間都很短暫,而且不會獨佔,這樣鎖定至多會存在十幾毫秒。可是若是有些程序須要高併發,那麼這些程序就須要尋找其餘的解決方案了。

相關文章
相關標籤/搜索