Mysql索引詳解


索引

存儲引擎用於快速找到記錄的一種數據結構。

索引類型

索引有很多種類型,如: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也就會獎相關的列值存儲在一起。優點如下:

  1. 索引大大減少了服務器掃描的數據量
  2. 索引可以幫助服務器避免排序和臨時表
  3. 將隨機IO變為順序IO


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM