參考原文
b樹可以在內部節點同時儲存鍵和值,因此,把頻繁訪問的資料放在靠近根節點的地方將會大大提高熱點資料的查詢效率。這種特性使得b樹在特定資料重複多次查詢的場景中更加高效。
由於b+樹的內部節點只存放鍵,不存放值,因此,一次讀取,可以在記憶體頁中獲取更多的鍵,有利於更快地縮小查詢範圍。 b+樹的葉節點由一條鏈相連,因此,當需要進行一次全資料遍歷的時候,b+樹只需要使用o(logn)時間找到最小的乙個節點,然後通過鏈進行o(n)的順序遍歷即可。而b樹則需要對樹的每一層進行遍歷,這會需要更多的記憶體置換次數,因此也就需要花費更多的時間
首先要知道hash索引和b+樹索引的底層實現原理:
hash索引底層就是hash表,進行查詢時,呼叫一次hash函式就可以獲取到相應的鍵值,之後進行回表查詢獲得實際資料。b+樹底層實現是多路平衡查詢樹。對於每一次的查詢都是從根節點出發,查詢到葉子節點方可以獲得所查鍵值,然後根據查詢判斷是否需要回表查詢資料。
那麼可以看出他們有以下的不同:
因為在hash索引中經過hash函式建立索引之後,索引的順序與原順序無法保持一致,不能支援範圍查詢。而b+樹的的所有節點皆遵循(左節點小於父節點,右節點大於父節點,多叉樹也類似),天然支援範圍。
因此,在大多數情況下,直接選擇b+樹索引可以獲得穩定且較好的查詢速度。而不需要使用hash索引。
在b+樹的索引中,葉子節點可能儲存了當前的key值,也可能儲存了當前的key值以及整行的資料,這就是聚簇索引和非聚簇索引。 在innodb中,只有主鍵索引是聚簇索引,如果沒有主鍵,則挑選乙個唯一鍵建立聚簇索引。如果沒有唯一鍵,則隱式的生成乙個鍵來建立聚簇索引。
當查詢使用聚簇索引時,在對應的葉子節點,可以獲取到整行資料,因此不用再次進行回表查詢。
澄清乙個概念:innodb中,在聚簇索引之上建立的索引稱之為輔助索引,輔助索引訪問資料總是需要二次查詢,非聚簇索引都是輔助索引,像復合索引、字首索引、唯一索引,輔助索引葉子節點儲存的不再是行的物理位置,而是主鍵值
何時使用聚簇索引與非聚簇索引
不一定,這涉及到查詢語句所要求的字段是否全部命中了索引,如果全部命中了索引,那麼就不必再進行回表查詢。
舉個簡單的例子,假設我們在員工表的年齡上建立了索引,那麼當進行select age from employee where age < 20
的查詢時,在索引的葉子節點上,已經包含了age資訊,不會再次進行回表查詢。
mysql可以使用多個字段同時建立乙個索引,叫做聯合索引。在聯合索引中,如果想要命中索引,需要按照建立索引時的字段順序挨個使用,否則無法命中索引。
具體原因為:
mysql使用索引時需要索引有序,假設現在建立了"name,age,school"的聯合索引,那麼索引的排序為: 先按照name排序,如果name相同,則按照age排序,如果age的值也相等,則按照school進行排序。
當進行查詢時,此時索引僅僅按照name嚴格有序,因此必須首先使用name欄位進行等值查詢,之後對於匹配到的列而言,其按照age欄位嚴格有序,此時可以使用age欄位用做索引查詢,以此類推。因此在建立聯合索引的時候應該注意索引列的順序,一般情況下,將查詢需求頻繁或者字段選擇性高的列放在前面。此外可以根據特例的查詢或者表結構進行單獨的調整。
mysql 新增b樹索引 Mysql之B樹索引
聚集索引 簡單概念 乙個表中根據主鍵建立的一棵b 樹,索引的葉子節點存放了表中所有的記錄,儲存記錄在物理位置上是連續的,乙個葉子節點存放一條對應的記錄 ps 是根據主鍵建立的b 樹,葉子節點存資料記錄 舉個例子 以漢語字典為例 漢語字典的正文本身就是乙個聚集索引,比如我們要查 安 字,由於漢語詞典的...
Mysql 索引(B樹或B 樹)
參考1 參考2myisam索引與innodb索引相比較 myisam支援全文索引 fulltext 壓縮索引,innodb不支援 innodb支援事務,myisam不支援 myisam順序儲存資料,索引葉子節點儲存對應資料行位址,輔助索引很主鍵索引相差無幾 innodb主鍵節點同時儲存資料行,其他輔...
索引之B樹 B 樹 B 樹 B 樹
原文索引之b樹 b 樹 b 樹 b 樹 b 樹即二叉搜尋樹 1.所有非葉子結點至多擁有兩個兒子 left 和right 2.所有結點儲存乙個關鍵字 3.非葉子結點的左指標指向小於其關鍵字的子樹,右指標指向大於其關鍵字的子樹 如 b樹的搜尋,從根結點開始,如果查詢的關鍵字與結點的關鍵字相等,那麼就命中...