B-Tree和B+Tree
目前大部分數據庫系統及文件系統都采用B-Tree或其變種B+Tree作為索引結構。
首先,對單個節點來說,是一個key value結構,key是作引的列,value有兩種,對於聚簇索引來說,value就是數據,對於二級索引來說,value就是指向數據的地址。
B-Tree的結構如下:
B-tree的特點是非葉子節點上也有數據。
B+Tree是B-Tree的變體,它的結構如下:
非葉子節點的職責就是為了定位下級節點的區間,不需要存儲數據。數據全部分散在葉子結點上。
B+Tree索引的優勢:
由於非葉子節點不存放數據,所以可以將非葉子節點定義為固定的區間,然后可以設計每個區間的葉子結點都存放在一片固定大小的連續的內存區域,在讀取的時候可以避免出現硬盤大量隨機讀的現象 。
Mysql中,不論是MyISAM還是InnoDB,都是使用的B+樹索引,不過InnoDB使用了聚簇索引,所以索引文件和數據文件是放在一塊的。MyISAM中,索引文件和數據文件是可以分開的。
了解不同存儲引擎的索引實現方式對於正確使用和優化索引都非常有幫助,例如知道了InnoDB的索引實現后,就很容易明白為什么不建議使用過長的字 段作為主鍵,因為所有輔助索引都引用主索引,過長的主索引會令輔助索引變得過大。再例如,用非單調的字段作為主鍵在InnoDB中不是個好主意,因為 InnoDB數據文件本身是一顆B+Tree,非單調的主鍵會造成在插入新記錄時數據文件為了維持B+Tree的特性而頻繁的分裂調整,十分低效,而使用 自增字段作為主鍵則是一個很好的選擇
ORACLE的索引,網上有的說是B-tree,但是給出圖上非葉子節點又沒有數據。像是B+。還有人說是B*。總之都大同小異,就不再研究了。