1. 程式人生 > >數據庫索引實現(B+,B-,hash)

數據庫索引實現(B+,B-,hash)

表數 顯式 下一個 搜索範圍 生成 方便 每一個 b+ 精確

★ B-Tree索引:每一個葉子節點都包含指向下一個葉子節點的指針,從而方便葉子節點的範圍遍歷。B-Tree通常意味著所有的值都是按順序存儲的,並且每一個葉子頁到根的距離相同,很適合查找範圍數據。

★ B+樹索引:並不能找到一個給定健值的具體行,B+樹索引只能找到被查找數據行所在的頁,然後從數據庫將頁讀入內存,在內存中查找。B+樹索引可以分為聚集索引和非聚集索引。聚簇索引是按照數據存放的邏輯地址為順序的,而非聚簇索引就不一樣了;聚簇索引能提高多行檢索的速度,而非聚簇索引對於單行的檢索很快。

○ 聚集索引 :聚集索引是一種索引組織形式,索引的鍵值邏輯順序決定了表數據行的物理存儲順序。 聚集索引對於那些經常要搜索範圍值的列特別有效。使用聚集索引找到包含第一個值的行後,便可以確保包含後續索引值的行在物理相鄰。

InnoDB的數據文件本身要按主鍵聚集,所以InnoDB要求表必須有主鍵(MyISAM可以沒有),如果沒有顯式指定,則MySQL系統會自動選擇一個可以唯一標識數據記錄的列作為主鍵,如果不存在這種列,則MySQL自動為InnoDB表生成一個隱含字段作為主鍵,這個字段長度為6個字節,類型為長整形。

○ 非聚集索引

非聚集索引僅僅只是對數據列創建相應的索引,不影響整個表的物理存儲順序。主鍵索引中,葉節點的data域存放的是數據記錄的地址,如果指定的Key存在,則取出其data域的值,然後以data域的值為地址,讀取相應數據記錄。(MYISAM采用此種索引方式)。

區別

聚集索引表裏數據物理存儲順序和主鍵索引的順序一致,所以如果新增數據是離散的,會導致數據塊趨於離散,而不是趨於順序。而非聚集索引表數據寫入的順序是按寫入時間順序存儲的。聚簇索引索引的葉節點就是數據節點;而非聚簇索引的葉節點仍然是索引節點,只不過有一個指針指向對應的數據塊。
適用情景

技術分享圖片

★ Hash索引:哈希索引基於哈希表實現,只有精確索引所有列的查詢才有效。對於每一行數據,存儲引擎都會對所有的索引列計算一個哈希碼,哈希碼是一個較小的值,並且不同鍵值的行計算出來的哈希碼也不一樣。哈希索引將所有的哈希存儲在索引中,同時在哈希表中保存指向每個數據的指針。

哈希索引中存儲的是:哈希值+數據行指針
MySQL中,只有Memory存儲引擎顯示支持hash索引,是Memory表的默認索引類型,盡管Memory表也可以使用B-Tree索引。Memory存儲引擎支持非唯一hash索引,也用鏈表解決hash沖突。這在數據庫領域是罕見的,如果多個值有相同的hash code,索引把它們的行指針用鏈表保存到同一個hash表項中。

數據庫索引實現(B+,B-,hash)