亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 數據庫 > SQLite > 正文

簡單分析SQLite4的一些設計改變

2020-01-25 19:26:15
字體:
來源:轉載
供稿:網友

這篇文章主要介紹了SQLite4的一些設計改變,SQLite作為內嵌式數據庫使用起來非常輕便,需要的朋友可以參考下

1.0 內容提要

SQLite4 是一個放在庫中的緊湊的,自包含的,零維護的的ACID數據庫引擎, 像SQLite3一樣, 但具有改進的接口和文件格式.

運行時環境封裝到了一個對象之中.

使用了一個很不錯的鍵值對存儲引擎:

一個獨立的大型鍵空間 - 不是SQLite3中那種每個表單獨的鍵空間和索引.

按字典順序的鍵排序.

多個存儲引擎,可在運行時互換.

默認在磁盤上的存儲殷勤使用了一個日志結構的合并數據庫.

表的PRIMARY KEY真正被用作存儲引擎的鍵.

可以使用小數點運算.

外鍵約束和遞歸觸發器默認是啟用的.

覆蓋指數可以顯示聲明.

2.0 概述

SQLite4 對于SQLite3而言,是一個可選方案,而不是一個替代方案. SQLite3 還沒有過時. SQLite3 和 QLite4 將會并行受到支持. SQLite3 遺留的好處不會被拋棄. SQLite3 還將會被持續的維護和改進. 但如果需要的話,新系統的設計者現在將可以選擇 SQLite4 而不是 SQLite3.

SQLite4 努力保持了SQLite3的最優秀特性,同時在不破壞兼容性的前提下解決了SQLite3中無法修復的問題. SQLite3 和 SQLite4 中將會持續保持一樣的特性有:

SQLite4 是放在一個庫中并鏈接到一個大型應用程序的完整的,關系型,事務性的, ACID, SQL 數據庫引擎. 沒有服務器,I/O直接面向硬盤.

SQLite4 的源代碼任何人可以用于任何目的. 沒有版權、發布或者公開源代碼或者編譯二進制文件方面的的限制. 不用去擔心煩人的許可證.

使用了動態類型,而不是大多數其它的SQL數據庫引擎所使用的僵化的靜態類型.

(默認)在磁盤上的鏡像是一個單獨的使用良好且穩定文件格式的磁盤文件, 使得SQLite4庫適合于作為一個應用程序的文件格式使用.

SQLite4 將會是快速且可靠的,無需管理員操心它就能運作的蠻好.

SQLite4 的實現只有最簡化的依賴,因而它可以很容易的集成到嵌入式系統或者其它非常規的運行時環境.

實現上仍然采用常用的匯編語言C。與SQLite3相比,SQLite4使用了更多C99特性,不過仍然可以使用常見的編譯器編譯。SQLite4使用了諸如size_t,int64_t,uint64_t以及其他標準數據類型。

SQLite4的編程接口與SQLite3的非常相似,只不過命名前綴都從sqlite3_更改為sqlite4_。SQLite3中舊的和作廢的接口已經從SQLite4中剔除了。給一些函數增加了參數,有時對參數稍作修改或者對其參數順序進行重新排序。修改了某些接口名字,使其更加符合其功能。總體上來說,SQLite4的編程接口與SQLite3的非常相似,這樣移植一個SQLite3上的應用到SQLite4上只需花一個小時或者兩個小時完成搜索替代就可以了。

SQLite3和SQLite4沒有共用任何符號,因此把SQLite3和SQLite4同時嵌入到同一進程,同時使用它們都是可行的.

3.0 SQLite4的主要改變 3.1 運行時對象

SQLite4中一些接口的第一個參數接收一個(新加的)指向一個sqlite4_env對象的指針,它定義了運行時環境。需要接收sqlite4_env指針的示例程序包括:

sqlite4_open()

sqlite4_malloc(), sqlite4_realloc(), and sqlite4_free()

sqlite4_mprintf()

sqlite4_random()

sqlite4_config()

一個sqlite4_env對象實例定義了SQLite4與其他系統交互是如何交互的。一個sqlite4_env對象包含的方法能夠:

分配,進入,離開和收回互斥體

分配,調整和釋放堆內存,

訪問和控制底層鍵/值存儲引擎,

使用高質量隨機種子初始化內建PRNG,

取得當前時間和日期與本地時區,

記錄error日志消息.

標準平臺(windows和Unix)的SQLite4構建包含了一個全局sqlite4_env對象,通常這個對象適配于所在平臺。如果一個接口程序的參數中有一個指向sqlite4_env對象的指針,而且傳給這個參數的指針是空指針時,這個接口程序就會使用默認的全局sqlite4_env對象。另外,某些應用可能要求在相同的地址空間上運行兩個或者多個SQLite4實例,同時每個實例使用了各自不同的互斥原語,不同的內存堆以及不同的時間日期函數等等。SQLite4通過對每個數據庫實例創建不同的sqlite4_env對象來滿足這種需求。sqlite4_env對象中還廢除了全局和靜態變量,這樣就可以非常容易地把SQLite4移植到哪些對靜態或者全局數據提供有限支持的嵌入式系統中。

3.2 簡化的鍵/值存儲引擎

相對于SQLite3,SQLite4使用的鍵/值存儲引擎擁有一個大大簡化了的接口。這個存儲引擎是可拔插的;通過對qlite4_env對象在打開新的數據庫連接前做適當的改動,它可以在運行時被改變。

SQLite4 需要一個實現了有序鍵/值對的存儲引擎,它的鍵和值是任意長度的二進制數據。鍵必須惟一,且按字典排序。也就是說,鍵應該根據一個比較函數進行排序,例如:

復制代碼代碼如下:

int key_compare(const void *key1, int n1, const void *key2, int n2){

int c = memcmp(key1, key2, n1

if( c==0 ) c = n1 - n2;

return c;

}

給定一個探針鍵,SQLite4需要能夠找到它最近的鍵,然后以字典序升序或降序遍歷鍵。向一個已有的鍵插入數據時會覆蓋舊數據。事務,包括原子提交和回滾,由存儲引擎負責。

SQLite4經由表和索引,將所有數據存儲到一個單獨的鍵空間, 與此相反,SQLite3中每個表和索引都需要一個單獨的鍵空間。SQLite4的存儲也與SQLite3不同,因為它需要存儲引擎以字典序對鍵進行排序, 而SQLite3使用了一個非常復雜的比較函數來決定記錄的存儲順序。

SQLite4與存儲引擎之間的通信是通過一個定義完善的并且簡單的接口進行的。新的存儲引擎可以在運行期間進行替換:只要在指定數據庫連接之前替換sqlite4_env對象里的某些函數指針就可以了。

如果替換的存儲引擎不支持回滾,那么這就意味著SQLite4無法運行ROLLBACK。如果替換的存儲引擎不支持事務嵌套,那么這就意味著SQLite4無法運行嵌套事務。因此,嵌入到SQLite4中的存儲引擎的功能越少,對應的整體的系統功能就會越差。

默認情況下內置的存儲引擎是日志結構的合并式數據庫。它比LevelDB要快很多倍,支持嵌套式事務,它把整個內容存儲在單一的磁盤文件里。SQLite4的未來版本還可能包含一個內置的采用B樹結構的存儲引擎。

3.3 現在的PRIMARY KEY是真正的主鍵

Sqlite3允許聲明表中的任何單個或多列為主鍵。但在內部,SQLite3只將PRIMARY KEY簡單地當做唯一約束來對待。實際中用于存儲使用的鍵是每一行的rowid。

Sqlite4則相反,它真實地使用聲明的表主鍵(更確切地說是PRIMARY KEY的編碼值)作為鍵而插入存儲引擎。SQLite4表通常沒有rowid(除非在表沒有PRIMARY KEY的情況下,這時需要一個rowid作為隱式主鍵。)這意味著內容在磁盤中按主鍵的順序存儲。這也意味著可以通過對PRIMARY KEY的一次查詢即可定位記錄。在SQLite3中,主鍵上的一個搜索意味著在自動創建的索引中先找到rowid,然后依據該rowid對主表做一個二次搜索。

SQLite4 需要 PRIMARY KEY 的所有元素不能為空. 這是一條SQL標準. 由于早期版本的疏忽, SQLite3 沒有在PRIMARY KEY 列上強制加上這條NOT NULL約束,到該漏洞被發現的時候SQLite3已經在被廣泛使用了, NOT NULL 約束的激活就可能會對太多的程序造成影響.

3.4 十進制數

SQLite4 使用十進制算數做所有的數字計算. SQLite4 從不使用C類型的double或者float(除了在double和內部十進制表示之間轉換時使用語接口例程中). 相反,所有數字值在內部表示方式為一個帶有3位數字的基于10的指數的18位十進制數. 這一表示方式的特性有:

即使是在缺乏對于IEEE 754 binary64浮點數字支持的平臺上,其運作起來也是可靠和兼容的.

貨幣計算通??梢跃_的進行,不需要四舍五入.

任何有符號和無符號的64位整數都能被精確的表示.

浮點數范圍和精確度超出了 IEEE 754 binary64 浮點數.

正無窮和負無窮以及 NaN (Not-a-Number) 都有良好的表示方式.

SQLite4 使得整型和浮點型數字之間沒有了差別. 不過期卻有精確和近似數之間的分別. 在 C/C++ 中, 整形數是精確的而浮點數是近似的. 但SQLite4并不一定如此. 浮點數字在SQLite4可以是精確的. 可以用64位表示的整型數在SQLite4中總是精確的,而大型的整型數則可能是近似的.

SQLite4 數字格式是面向內部使用的. 數字可以在整型和double型之間轉換,用于輸入和輸出. 磁盤上的存儲空間需要從1到12位的SQLite4數字值, 這取決于其大小和重要的位數.

3.5 外鍵約束和遞歸觸發器是默認開啟的

外鍵約束在SQLite3的早期版本中是沒有的,并且他們默認關閉了向后兼容的能力。但是外鍵約束一直是有效的,并且在SQLite4中是默認打開的。所有的外鍵約束都是默認延遲的,盡管他們能夠被定義成立即創建。但是,沒有有效的機制去觸發外鍵約束,不管是延遲創建還是立即創建。

SQLite3提供了遞歸觸發器,但是這只是在一個運行時才有效的功能。在SQLite4中,所有的觸發器在所有的時間段里都是遞歸的。

3.6 明確的索引覆蓋

SQLite4 像 CREATE TABLE 語句中條件了一個可選的子句,該子句定義了在索引中重復的附加列信息. 這可以讓應用程序開發者在SQLite4中無需使用任何花招就可以明確地創建覆蓋索引. 例如:

 

 
  1. CREATE INDEX cover1 ON table1(a,b) COVERING(c,d); 

上面的 cover1 索引可以在存儲引擎中用一個單一的查找操作來進行形式如 "SELECT c,d FROM table1 WHERE a=?1 AND b=?2" 的查詢. 索引中如果沒有附加的 COVERING 子句, SQLite4 也許會在存儲引擎中做兩次操作; 一次操作基于a和b的值來找到主鍵,而第二次操作則基于主鍵來找到c和d的值. COVERING 子句使得c和d的值在索引中就可用,這意味著它們無需第二次查找就可以從索引中提取出來.

COVERING 語句上有一個變化:

 

 
  1. CREATE INDEX cover2 ON table(x,y) COVERING ALL; 

COVERING ALL 語句的意思是數據表的所有列都在索引中被重復一份,這就確保了原來的數據表永遠也不會被訪問到,以完成一個使用了這個索引的查詢. 這種方法的缺點,當然就是信息重復,而且因此讓數據庫文件更大. 但是通過在索引指標上明確指定COVERING關閉,SQLite4可以讓應用程序開發者權衡著從應用程序中騰出空間和時間來讓其更加適用.

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
夜夜躁日日躁狠狠久久88av| 国产精品ⅴa在线观看h| 欧美激情在线观看| 在线精品国产欧美| 热久久美女精品天天吊色| 久久精品国产清自在天天线| 色噜噜狠狠狠综合曰曰曰| 欧美午夜片在线免费观看| 亚洲理论在线a中文字幕| 久久久在线免费观看| 亚洲欧美中文日韩v在线观看| 国产亚洲精品久久| 日韩一区视频在线| 亚洲欧美精品中文字幕在线| 久久综合伊人77777尤物| 国产中文字幕91| 热久久视久久精品18亚洲精品| 成人久久久久爱| 久久久久久久久久久91| 亚洲精品国产综合久久| 久久精品视频免费播放| 亚洲深夜福利视频| 亚洲激情小视频| 日韩在线观看成人| 欧美肥臀大乳一区二区免费视频| 91精品在线一区| 97在线观看免费| 欧美性猛交xxxx免费看漫画| 欧美激情视频网站| 亚洲精品不卡在线| 国产ts人妖一区二区三区| 日本亚洲欧洲色α| 亚洲国产精品高清久久久| 久久免费国产精品1| 亚洲精品av在线| 正在播放欧美视频| 精品视频偷偷看在线观看| 欧美黄色片视频| 久久久精品国产网站| 国产成人在线播放| 亚洲精品videossex少妇| 亚洲色图在线观看| 欧美夫妻性生活视频| 国产亚洲精品美女| 日韩av网站电影| 欧美交受高潮1| 久久久久久久久久久久久久久久久久av| 美女福利视频一区| 国产美女久久精品| 国产精品你懂得| 久久伊人91精品综合网站| 日韩va亚洲va欧洲va国产| 国产精品日韩在线播放| 精品一区电影国产| 国产一区二区三区欧美| 国产精品久久久久国产a级| 国产亚洲精品久久久久久牛牛| 久久99国产综合精品女同| 日韩av综合网站| 欧美性视频网站| 国内精品美女av在线播放| 亚洲天堂精品在线| 国产91露脸中文字幕在线| 日本精品一区二区三区在线| www日韩中文字幕在线看| 久久精品成人一区二区三区| 久久精品视频99| 九九久久久久99精品| 国内免费久久久久久久久久久| 亚洲精品美女在线观看| 蜜臀久久99精品久久久无需会员| 亚洲最大福利视频网站| 精品中文字幕久久久久久| 欧美俄罗斯乱妇| 久久综合伊人77777蜜臀| 亚洲网站在线观看| 成人网在线免费看| 日韩精品有码在线观看| 欧美高清在线播放| 欧美老少配视频| 国产精品免费小视频| 日韩免费观看网站| 亚洲欧美资源在线| 久久久久久高潮国产精品视| 91精品国产99久久久久久| 亚洲最大av网站| 国产精品久久久久久av福利| 久久91亚洲精品中文字幕奶水| 久久精品中文字幕电影| 国内精品伊人久久| 日韩高清电影好看的电视剧电影| 欧美最猛性xxxx| 国产精品久久久久久久美男| 亚洲韩国欧洲国产日产av| 久久精品中文字幕一区| 亚洲一区二区三区视频播放| 在线日韩av观看| 疯狂做受xxxx欧美肥白少妇| 欧美性猛交xxxxx免费看| 亚洲成人精品视频在线观看| 国产成人+综合亚洲+天堂| 91福利视频在线观看| 日韩大陆毛片av| 精品丝袜一区二区三区| 97久久精品人人澡人人爽缅北| 亚洲天堂av在线免费| 亚洲少妇中文在线| 久久精品国产亚洲精品| 亚洲人成在线观看| 亚洲丁香久久久| 美女久久久久久久| 精品国产老师黑色丝袜高跟鞋| 久久精品国产69国产精品亚洲| 欧美一级成年大片在线观看| 91亚洲永久免费精品| 91久久精品日日躁夜夜躁国产| 国产91精品网站| 一区二区三区精品99久久| 亚洲高清免费观看高清完整版| 欧美精品videossex88| 夜色77av精品影院| 国产精品av免费在线观看| 最新国产精品亚洲| 欧美专区在线观看| 免费91在线视频| 亚洲精品美女久久久久| 亚洲美女中文字幕| 中文字幕av一区二区三区谷原希美| www.99久久热国产日韩欧美.com| 亚洲男人天堂久| 国产日韩欧美中文| www.日韩视频| 国产精品在线看| 欧美一区二区视频97| 亚洲性av网站| 国产精品黄页免费高清在线观看| 国产成人精品日本亚洲专区61| 黑人巨大精品欧美一区二区免费| 久久这里有精品视频| 国产精品极品尤物在线观看| 久久久噜噜噜久久| 久久久久久18| 国产视频亚洲精品| 91午夜在线播放| 91系列在线观看| 亚洲影院色在线观看免费| 亚洲精品日韩久久久| 国产精品视频自在线| 久久精品99久久香蕉国产色戒| 欧美极品在线播放| 538国产精品一区二区免费视频| 日韩在线视频中文字幕| 欧美日韩加勒比精品一区| 欧美成人免费在线视频| 国产精品美乳一区二区免费| 亚洲性生活视频在线观看| 在线播放日韩av| 亚洲嫩模很污视频| 日韩成人在线免费观看| 欧美老女人性视频| 一本大道香蕉久在线播放29| 精品亚洲男同gayvideo网站| 日韩最新在线视频| 亚洲欧美综合精品久久成人|