索引
存儲引擎用於快速找到記錄的一種數據結構。
索引類型
索引有很多種類型,如:B-tree索引、哈希索引、空間數據索引R-TREE 、全文索引、主鍵索引等,在Mysql
中,索引是在存儲引擎層而不是服務器層實現的。所以沒有統一的索引標准——不同存儲引擎的索引工作方式並
不一樣,也不是所有存儲引擎都支持所有類型的索引。即使多個存儲引擎支持同一種類型的索引,其底層實現
也可能不一樣。
B-Tree索引
討論索引的時候,如果沒有特別的指明類型,那么多半說的是B-Tree索引,它使用B-Tree數據結構來存儲數據。
實際很多存儲引擎使用的是B+Tree,即每一個葉子節點都包含指向下一個葉子節點的指針,從而方便葉子節點
的范圍遍歷。
存儲引擎不同的方式使用B-Tree索引,性能也各有不同,各有優劣。如:MyISAM使用前綴壓縮技術使得索引更小,
但是InnoDB則按照原數據格式進行存儲。 MyISAM索引通過數據的物理位置引用被索引的行,而InnoDB則根據主鍵
引用被索引的行
- B-Tree索引查詢類型
B-Tree適用於全鍵值、鍵值范圍,或者鍵前綴查找。
哈希索引
Hash Index 基於哈希表實現,只有精確匹配索引所有列的查詢才有效。對於每一行數據,存儲引擎都會對所有的索引列計算
一個哈希碼,哈希碼是一個較小的值,並且不同鍵值的行計算出來的哈希碼也不一樣。哈希索引將所有的哈希碼存儲在索引中,
同時在哈希表中保存指向每個數據行的指針。
InnoDB引擎有一個特殊功能叫“自適應哈希索引,當InnoDB某些索引值被使用得非常頻繁時,也在內存中基於B-Tree索引之上
再創建一個哈希索引。這樣就讓Btree索引也具有哈希索引的一些優點。這是一個完全自動的,內部的行為,用戶無法控制或者
配置,不過如果有必要完全可以關閉該功能。
- 創建自定義的Hash Index
SELECT id FROM url_tbl WHERE url="http://baidu.com"
SELECT id FROM url_tbl WHERE url_crc=CRC32("http://baidu.com")
如果采用這種方式,記住不要使用SHA1和MD5()作為哈希函數,因為這兩函數計算出非常長的字符串,會浪費大量的空間,比較時
也會更慢。兩函數設計目標是最大限度消除沖突,但這里並不需要這樣高的要求。如果數據表非常大,CRC32會出現大量的哈希沖突,
則可以考慮自己實現一個簡單的64痊哈希函數。
R-Tree
MyISAM引擎支持空間索引,可以用作地理數據存儲。
全文索引
全文索引是一種特殊類型的索引,它查找的是文本中的關鍵詞,而不是直接索引中的值。全文搜索和其他幾類索引的匹配方式完全不
一樣。它有很多需要注意的,如停用詞、詞干、復數、布爾搜索等。
索引的優點
索引可以讓服務器快速定位到表的指定位置。B-Tree索引,按照順序存儲數據,可以用於order by 和Group by 操作。因為數據是
有序的,所有B-tree也就會獎相關的列值存儲在一起。優點如下:
- 索引大大減少了服務器掃描的數據量
- 索引可以幫助服務器避免排序和臨時表
- 將隨機IO變為順序IO