InnoDB存儲引擎索引概述
InnoDB存儲引擎支持以下幾種常見的索引:
?B+樹索引
?全文索引
?哈希索引
B+樹索引并不能找到一個給定鍵值的具體行栏豺。B+樹索引能找到的只是被查找數據行所在的頁吓揪。然后數據庫通過把頁讀入到內存介陶,再在內存中進行查找,最后得到要查找的數據蔓纠。
B+樹是通過二叉查找樹榛斯,再由平衡二叉樹绊汹,B樹演化而來。
平衡二叉樹的定義如下:首先符合二叉查找樹的定義奖慌,其次必須滿足任何節(jié)點的兩個子樹的高度最大差為1抛虫。
平衡二叉樹的查詢速度的確很快,但是維護一棵平衡二叉樹的代價是非常大的简僧。通常來說建椰,需要1次或多次左旋和右旋來得到插入或更新后樹的平衡性。
對一棵平衡樹的維護是有一定開銷的岛马,不過平衡二叉樹多用于內存結構對象中广凸,因此維護的開銷相對較小。
B+樹
B+樹由B樹和索引順序訪問方法(ISAM)演化而來蛛枚,但是在現實使用過程中幾乎已經沒有使用B樹的情況了谅海。
B+樹是為磁盤或其他直接存取輔助設備設計的一種平衡查找樹。在B+樹中蹦浦,所有記錄節(jié)點都是按鍵值的大小順序存放在同一層的葉子節(jié)點上扭吁,由各葉子節(jié)點指針進行連接。其高度為2盲镶,每頁可存放4條記錄侥袜,扇出(fan out)為5。
B+索引在數據庫中有一個特點是高扇出性溉贿,因此在數據庫中枫吧,B+樹的高度一般都在2~4層,這也就是說查找某一鍵值的行記錄時最多只需要2到4次IO宇色,這倒不錯九杂。因為當前一般的機械磁盤每秒至少可以做100次IO,2~4次的IO意味著查詢時間只需0.02~0.04秒宣蠕。
聚集索引(clustered index)
聚集索引(clustered index)就是按照每張表的主鍵構造一棵B+樹例隆,同時葉子節(jié)點中存放的即為整張表的行記錄數據,也將聚集索引的葉子節(jié)點稱為數據頁抢蚀。聚集索引的這個特性決定了索引組織表中數據也是索引的一部分镀层。同B+樹數據結構一樣,每個數據頁都通過一個雙向鏈表來進行鏈接皿曲。
聚集索引的存儲并不是物理上連續(xù)的唱逢,而是邏輯上連續(xù)的吴侦。這其中有兩點:一是前面說過的頁通過雙向鏈表鏈接,頁按照主鍵的順序排序坞古;另一點是每個頁中的記錄也是通過雙向鏈表進行維護的备韧,物理存儲上可以同樣不按照主鍵存儲。
聚集索引的另一個好處是绸贡,它對于主鍵的排序查找和范圍查找速度非扯⒑快毅哗。葉子節(jié)點的數據就是用戶所要查詢的數據听怕。如用戶需要查詢一張注冊用戶的表,查詢最后注冊的10位用戶虑绵,由于B+樹索引是雙向鏈表的尿瞭,用戶可以快速找到最后一個數據頁,并取出10條記錄翅睛。
輔助索引(Secondary Index)
葉子節(jié)點并不包含行記錄的全部數據声搁。葉子節(jié)點除了包含鍵值以外,每個葉子節(jié)點中的索引行中還包含了一個書簽(bookmark)捕发。該書簽用來告訴InnoDB存儲引擎哪里可以找到與索引相對應的行數據疏旨。由于InnoDB存儲引擎表是索引組織表,因此InnoDB存儲引擎的輔助索引的書簽就是相應行數據的聚集索引鍵扎酷。
B+樹索引的使用
聯合索引
覆蓋索引
哈希索引
哈希索引只能用來搜索等值的查詢
全文檢索
將存儲于數據庫中的整本書或整篇文章中的任意內容信息查找出來的技術檐涝。它可以根據需要獲得全文中有關章、節(jié)法挨、段谁榜、句、詞等信息凡纳,也可以進行各種統計和分析窃植。
倒排索引(inverted index)
?inverted file index,其表現形式為 {單詞荐糜,單詞所在文檔的ID}
?full inverted index巷怜,其表現形式為 {單詞,(單詞所在文檔的ID暴氏,在具體文檔中的位置)}
B+樹索引 和 哈希索引還比較好理解
光全文索引就可以出一本書咯丛版,目前看概念沒法子理解%>_<%