——索引優化,能夠說是數據庫相關優化、理解尤爲是查詢優化中最經常使用的優化手段之一。因此,只有深刻索引的實現原理、存儲方式、不一樣索引間區別,才能設計或使用最優的索引,最大幅度的提高查詢效率!php
至關於一個節點能夠有大於2個子節點的二叉查找數。html
B tree :是一種自平衡數,可以保持數據有序(每一層都有序),查找、刪除、插入時間爲O(logn)。全部葉子節點都在一層,跟記錄有關的信息會放在每個節點,因此查找一個記錄跟二叉查找樹同樣,從根遍歷。非葉子節點能夠擁有可變數量的子節點(數量範圍事先定好),當插入或刪除致使超出範圍,可能會分離或者合併。面試
B+ tree :可以保持數據有序(每一層都有序),查找、刪除、插入時間爲O(logn)。全部葉子節點都在一層,跟記錄有關的信息都放在葉子節點上,非葉子節點只存放索引,且將葉子節點經過指針鏈接在一塊兒,造成一條鏈表。因此對整棵樹的遍歷只要一次線性遍歷葉子節點便可。算法
查找以典型的方式進行,相似於二叉查找樹。起始於根節點,自頂向下遍歷樹,選擇其分離值在要查找值的任意一邊的子指針。在節點內部典型的使用是二分查找來肯定這個位置。sql
節點要處於違規狀態,它必須包含在可接受範圍以外數目的元素。數據庫
1、B+Tree索引數據結構
一、概述架構
Mysql數據庫中使用最頻繁的索引類型,基本全部存儲引擎都支持BTree索引。正是其優異的檢索表現,才使其有這樣的地位。優化
二、存儲結構spa
正如其名,這類索引的物理文件大多就是以BTree結構來存儲的,但會有不一樣的存儲引擎在使用BTree索引時,對存儲結構稍做修改,好比MyISAM存儲引擎,使用B+Tree的數據結構,它相對與BTree結構,全部的數據都存放在葉子節點上,且把葉子節點經過指針鏈接到一塊兒,造成了一條數據鏈表,以加快相鄰數據的檢索效率。
(對B樹、B+樹不熟悉的,可參看博客索引基礎——B-Tree、B+Tree、紅黑樹、B*Tree數據結構 或《算法導論》)
另外,對於innoDB存儲引擎,雖然一樣使用B+Tree做爲索引的存儲結構,但具體實現卻與MyISAM大相徑庭,這也是做爲MyISAM與InnoDB存儲引擎的一個重要區別反覆被面試官問到。(關於MyISAM與InnoDB存儲引擎可參看博客MySQL架構設計——MyISAM存儲引擎與InnoDB存儲引擎)
(1)MyISAM引擎索引結構的葉子節點的數據域,存放的並非實際的數據記錄,而是數據記錄的地址。索引文件與數據文件分離,這樣的索引稱爲「非聚簇索引」。MyISAM的主索引與輔助索引區別並不大,只是主鍵索引不能有重複的關鍵字。
以下圖所示爲非聚簇索引的主鍵索引:
其檢索算法:先按照B+Tree的檢索算法檢索,找到指定關鍵字,則取出對應數據域的值,做爲地址取出數據記錄。
(2)InnoDB引擎索引結構的葉子節點的數據域,存放的就是實際的數據記錄(對於主索引,此處會存放表中全部的數據記錄;對於輔助索引此處會引用主鍵,檢索的時候經過主鍵到主鍵索引中找到對應數據行),或者說,InnoDB的數據文件自己就是主鍵索引文件,這樣的索引被稱爲「聚簇索引」,一個表只能有一個聚簇索引。
以下圖所示爲聚簇索引的主鍵索引:
MySQL中只有memory支持Hash索引
參考:https://blog.csdn.net/zhangliangzi/article/details/51366345