1、索引的出現其實就是為了提高資料查詢的效率,就像書的目錄一樣。
2、索引的出現是為了提高查詢效率,但是實現索引的方式卻有很多種,所以這裡也就引入了索引模
型的概念。可以用於提高讀寫效率的資料結構很多,這裡我先給你介紹三種常見、也比較簡單的
資料結構,它們分別是雜湊表、有序陣列和搜尋樹。
2、雜湊表:
假設,你現在維護著乙個身份證資訊和姓名的表,需要根據身份證號查詢對應的名字,這時對應
的雜湊索引的示意圖如下所示:
圖中,user2和user4根據身份證號算出來的值都是n,但沒關係,後面還跟了乙個鍊錶。假設,
這時候你要查id_card_n2對應的名字是什麼,處理步驟就是:首先,將id_card_n2通過雜湊函
數算出n;然後,按順序遍歷,找到user2。
需要注意的是,圖中四個id_card_n的值並不是遞增的,這樣做的好處是增加新的user時速度會
很快,只需要往後追加。但缺點是,因為不是有序的,所以雜湊索引做區間查詢的速度是很慢
的。你可以設想下,如果你現在要找身份證號在[id_card_x, id_card_y]這個區間的所有使用者,就必
須全部掃瞄一遍了。
2、有序陣列:
這裡我們假設身份證號沒有重複,這個陣列就是按照身份證號遞增的順序儲存的。這時候如果你
要查id_card_n2對應的名字,用二分法就可以快速得到,這個時間複雜度是o(log(n))。
同時很顯然,這個索引結構支援範圍查詢。你要查身份證號在[id_card_x, id_card_y]區間的
user,可以先用二分法找到id_card_x(如果不存在id_card_x,就找到大於id_card_x的第一
個user),然後向右遍歷,直到查到第乙個大於id_card_y的身份證號,退出迴圈。
如果僅僅看查詢效率,有序陣列就是最好的資料結構了。但是,在需要更新資料的時候就麻煩
了,你往中間插入乙個記錄就必須得挪動後面所有的記錄,成本太高。
所以,有有序序數陣列組索索引引只只適適用用於於靜靜態態存保儲存引引擎擎,
3、二叉搜尋樹:
二叉搜尋樹的特點是:每個節點的左兒子小於父節點,父節點又小於右兒子。這樣如果你要查
id_card_n2的話,按照圖中的搜尋順序就是按照usera ->userc->userf ->user2這個路徑得
到。這個時間複雜度是o(log(n))。
當然為了維持o(log(n))的查詢複雜度,你就需要保持這棵樹是平衡二叉樹。為了做這個保證,更
新的時間複雜度也是o(log(n))。
樹可以有二叉,也可以有多叉。多叉樹就是每個節點有多個兒子,兒子之間的大小保證從左到右
遞增。二叉樹是搜尋效率最高的,但是實際上大多數的資料庫儲存卻並不使用二叉樹。其原因
是,索引不止存在記憶體中,還要寫到磁碟上。
你可以想象一下一棵100萬節點的平衡二叉樹,樹高20。一次查詢可能需要訪問20個資料塊。在
機械硬碟時代,從磁碟隨機讀乙個資料塊需要10 ms左右的定址時間。也就是說,對於乙個100
萬行的表,如果使用二叉樹來儲存,單獨訪問乙個行可能需要20個10 ms的時間,這個查詢可真
夠慢的。
4、基於主鍵索引和普通索引的查詢有什麼區別?
如果語句是select *fromtwhere id=500,即主鍵查詢方式,則只需要搜尋id這棵b+樹;
如果語句是select *fromtwhere k=5,即普通索引查詢方式,則需要先搜尋k索引樹,得到id
的值為500,再到id索引樹搜尋一次。這個過程稱為回表。
也就是說,基於非主鍵索引的查詢需要多掃瞄一棵索引樹。因此,我們在應用中應該盡量使用主
鍵查詢。
在k索引樹上找到k=3的記錄,取得 id = 300;
再到id索引樹查到id=300對應的r3;
在k索引樹取下乙個值k=5,取得id=500;
再回到id索引樹查到id=500對應的r4;
在k索引樹取下乙個值k=6,不滿足條件,迴圈結束。
在這個過程中,回到主鍵索引樹搜尋的過程,我們稱為回表。可以看到,這個查詢過程讀了k索引樹的3條記錄(步驟1、3和5),回表了兩次(步驟2和4)
如果執行的語句是select id fromtwhere k between 3 and 5,這時只需要查id的值,而id的值
已經在k索引樹上了,因此可以直接提供查詢結果,不需要回表。也就是說,在這個查詢裡面,
索引k已經「覆蓋了」我們的查詢需求,我們稱為覆蓋索引。
由於覆蓋索引可以減少樹的搜尋次數,顯著提公升查詢效能,所以使用覆蓋索引是乙個常用的效能優化手段。
資料庫之 索引
資料庫為什麼要有索引?答 用於提高資料庫表的資料訪問速度。資料庫索引的資料結構基礎是b tree 多叉樹 b tree結構如下圖 ps 源自網路 索引是針對資料庫表中的某一列或多列建立的。建立索引 create index from tablename tableparam 建立多列索引 creat...
資料庫之索引
索引我們分為四類來講 單列索引 普通索引,唯一索引,主鍵索引 組合索引 全文索引 空間索引。1.單列索引 乙個索引只包含單個列,但乙個表中可以有多個單列索引。這裡不要搞混淆了。mysql中基本索引型別,沒有什麼限制,允許在定義索引的列中插入重複值和空值,純粹為了查詢資料更快一點 索引列中的值必須是唯...
資料庫之索引
索引 基本概念 在資料庫中建立索引是為了加快資料的查詢速度。資料庫中的索引與書籍中的目錄類似。資料庫中的索引是乙個表中所包含的列值的列表,其中註明了表中包含各個值的行資料所在的儲存位置。可以為表中的單個列建立索引,也可以為一組列建立索引。索引一般採用b樹結構。索引由索引項組成,索引項由來自表中每一行...