索引的本質與挑選索引

2021-08-28 11:34:14 字數 1913 閱讀 3153

2 索引的代價

3 索引使用策略與優化

4 參考鏈結

索引是幫助mysql高效獲取資料的資料結構。

索引的本質其實就是b+樹,而b+樹是對b樹的優化。所以還得先從b樹說起。

(1)實現思路

索引的主要作用是為了查詢資料,對於樹這樣的資料結構來說,樹的高度越低,那麼查詢節點的效率也就越高。將二叉樹的結構改變為多叉樹結構以降低樹的高度,正是b樹的實現思路。

(2)定義

b樹又稱為平衡多路查詢樹,一棵m階的b樹滿足下列條件:

(3)描述

定義資料記錄為二元組[key, data],key是記錄的鍵值,不同的資料記錄,key互不相同;data為除key外的資料記錄。

b樹的儲存結構如下所示:

(4)查詢

根據b樹的特徵,首先從根節點開始,進行二分法查詢,如果key值相等則返回該節點的data資料,否則對相應區間的指標指向的節點遞迴進行查詢,直到找到節點或返回null。

b+樹才是mysql中普遍使用的索引結構,相較於b樹最大的區別就是——內節點不儲存data,只儲存key,而葉子節點不儲存指標

正是因為這個特徵,所以b+樹的內節點能容納的關鍵字更多。

在b+樹的基礎之上,我們還會增加順序訪問指標,即在每乙個葉子節點增加乙個指向相鄰葉子節點的指標,形成帶有順序訪問指標的b+樹。這樣便能提高間區訪問的效率。

結構如下所示:

相較於b樹,我們就能發現兩點優化:①內節點不儲存data②葉子節點間增加指向相鄰葉子節點的指標。

所以相較於b樹,b+樹有以下優點:

建立索引雖然能夠極大的提高資料庫的查詢速度。但它也是有一定代價的,體現在時間和空間開銷上。 空間

索引的確是個好東西,那麼字段符合什麼樣的條件適合選作索引呢?

為用於搜尋、排序或分組的字段建立索引,而對於用作輸出顯示的列則不用建立索引。即那些出現在where子句、連線子句、order by或group by的字段作為索引是最佳的,而那些出現在select子句後的字段則最好不建立。

欄位的值重複性小的。當索引列的值重複性較高時,比如性別(『m』和』f』)幾乎是各佔一半的情況下,那麼索引可能根本無法使用,因為當查詢優化程式確定出某個值在表的行裡出現頻率很大時,它會跳過索引,轉去執行全表掃瞄操作。

索引短小值。即應盡量選擇較小的資料型別。這樣能有效提高處理效能,減少時間與空間上的消耗。

索引字串值的字首。想要對字串列進行索引,應當盡可能指定字首長度。

利用最字首。當建立包含n個列的復合索引時,實際上會建立n個專供mysql使用的索引。舉個例子,資料表擁有乙個3個列的復合索引,列名分別為country、state和city,排列順序是country/state/city,因此會有以下3種組合:

country, state, city

country, state

country

如果沒有包含最左邊字首的那些搜尋,如按照state或city來搜尋,mysql無法使用索引。

不要建立過多的索引。索引並非越多越好,尤其是在資料量較大的情況下,每增加乙個索引都需要佔據額外的磁碟空間,而且會影響寫入操作的效能。

書籍:

文章:

索引的本質

在我學習了索引如何使用後,我開始有一些問題,而最根本的原因就是我不知道本質上索引是什麼,所以本文就是針對索引的本質來講下他的原理的。但是只以btree為例,其他資料結構或則演算法的索引原理會在其他文章講解。1.什麼是索引?首先,當我看見有一種索引的建立語句是如下的時候,create index in...

mysql的索引本質

1索引的定義 索引是幫助mysql高效獲取資料的排好序的資料結構 2 索引的本質 就是拍好序的資料結構 3.為啥b tree這種資料結構做索引的效率比其他的資料結構 紅黑樹,二叉樹,平衡二叉樹,hash表 效率高 具體的比較可以參考我之前的文章 主要是有以下幾個優點 b 樹的優點 1 b 樹的層級更...

索引的本質是排序

索引是經常用到的技術,但有些程式設計師對索引的原理了解不深,發現資料查詢效能有問題立刻就想起建索引,但效果常常也不盡人意。那麼到底什麼時候該用索引以及該怎麼用?我們來分析索引清理背後的技術原理就知道了。索引技術的初衷是為了快速從乙個大資料集中找出某個字段等於確定值 比如按身份證號找出某個人 的記錄。...