一些筆記
ROWID :
隱藏的 Column 用于作為行的唯一標識侈净。
ROWID 可以看做一個隱式的 INTEGER PRIMARY KEY ,實際上這才是真正的主鍵嘴高,如果創(chuàng)建了一個 INTEGER PRIMARY KEY 的話,
它會作為 ROWID 的別名(alias) ,而非 INTEGER PRIMARY KEY 實際上只是建立了一個索引舔痪。
算法是單調(diào)遞增静盅,如果達到最大整型(9223372036854775807) 那么會重新查找前面已經(jīng)刪除的 ROWID究流。Index 索引:
Index 是一種特殊的查找表蔼啦,數(shù)據(jù)庫搜索引擎用來加快數(shù)據(jù)檢索兰珍。簡單地說,索引是一個指向表中數(shù)據(jù)的指針询吴。
索引有助于加快 SELECT 查詢和 WHERE 子句,但它會減慢使用 UPDATE 和 INSERT 語句時的數(shù)據(jù)輸入亮元。
索引可以創(chuàng)建或刪除猛计,但不會影響數(shù)據(jù)。
每個主鍵會自動生成一個 IndexAUTOINCREMENT :
作用于主鍵爆捞,算法是單調(diào)遞增,算法上和 ROWID 的區(qū)別是達到最大整型了之后不會重新查找前面沒使用的值奉瘤。
如果 AUTOINCREMENT 關(guān)鍵字出現(xiàn)在 INTEGER PRIMARY KEY后面,則會更改自動 ROWID 分配算法(因為INTEGER PRIMARY KEY 就是 ROWID 別名)煮甥,
以防止在數(shù)據(jù)庫的整個生命周期內(nèi)重用 ROWID盗温。WITHOUT ROWID:
實際上可以指定不生成 ROWID ,那么必須要指定主鍵。
關(guān)于是否需要 ROWID 的問題成肘,總的來說是空間時間的影響卖局,大概是這樣的邏輯:
在普通的SQLite表中,PRIMARY KEY實際上只是一個 UNIQUE索引双霍。用于在磁盤上查找記錄的鍵是 ROWID砚偶。
普通SQLite表中的特殊“ INTEGER PRIMARY KEY ”列類型使該列成為 ROWID 的別名,因此 INTEGER PRIMARY KEY 是真正的 PRIMARY KEY洒闸。SQLite 的表是以 B-Tree 實現(xiàn)的染坯, 在 ROWID 表中如果有 非INTEGER PRIMARY KEY 實際上會建立兩個 B-Tree ,
一個是以 ROWID 為主鍵其余 column 為數(shù)據(jù)的 B-Tree;另一個 是以 非INTEGER PRIMARY KEY 為主鍵 ROWID 為數(shù)據(jù)的索引。
查詢的時候 首先在索引中根據(jù)找到匹配的 ROWID 然后再在主表中根據(jù) ROWID 查找數(shù)據(jù)丘逸,所以進行了兩次獨立的二進制搜索单鹿。關(guān)于 SQLite 查詢的結(jié)果的順序:
首先如果要保證查詢結(jié)果的順序最好就使用 ORDER BY ,否則會按照 Index 進行深纲,沒有或關(guān)閉 Index 的話會按照 ROWID 順序查詢仲锄。
https://www.sqlite.org/lang_createindex.html
https://www.sqlite.org/lang_createtable.html
https://www.sqlite.org/withoutrowid.html
https://sqlite.org/autoinc.html