MySql索引型別及其機制
一、MySql索引型別
Mysql目前主要有以下幾種索引型別:FULLTEXT,HASH,BTREE,RTREE。
Mysql常見索引有:主鍵索引、唯一索引、普通索引、全文索引、組合索引
- FULLTEXT
即為全文索引,目前只有MyISAM引擎支援。其可以在CREATE TABLE ,ALTER TABLE ,CREATE INDEX 使用,不過目前只有 CHAR、VARCHAR ,TEXT 列上可以建立全文索引。
全文索引並不是和MyISAM一起誕生的,它的出現是為了解決WHERE name LIKE “%word%"這類針對文字的模糊查詢效率較低的問題。
- HASH
由於HASH的唯一(幾乎100%的唯一)及類似鍵值對的形式,很適合作為索引。
HASH索引可以一次定位,不需要像樹形索引那樣逐層查詢,因此具有極高的效率。但是,這種高效是有條件的,即只在“=”和“in”條件下高效,對於範圍查詢、排序及組合索引仍然效率不高。
- BTREE
BTREE索引就是一種將索引值按一定的演算法,存入一個樹形的資料結構中(二叉樹),每次查詢都是從樹的入口root開始,依次遍歷node,獲取leaf。這是MySQL裡預設和最常用的索引型別。
- RTREE
RTREE在MySQL很少使用,僅支援geometry資料型別,支援該型別的儲存引擎只有MyISAM、BDb、InnoDb、NDb、Archive幾種。
相對於BTREE,RTREE的優勢在於範圍查詢。
二、索引的機制
1.為什麼我們新增完索引後查詢速度為變快?
傳統的查詢方法,是按照表的順序遍歷的,不論查詢幾條資料,mysql需要將表的資料從頭到尾遍歷一遍
在我們新增完索引之後,mysql一般通過BTREE演算法生成一個索引檔案,在查詢資料庫時,找到索引檔案進行遍歷(折半查詢大幅查詢效率),找到相應的鍵從而獲取資料
2.索引的代價
- 建立索引是為產生索引檔案的,佔用磁碟空間
- 索引檔案是一個二叉樹型別的檔案,可想而知我們的dml操作同樣也會對索引檔案進行修改,所以效能會下降
3.在哪些column上使用索引?
- 較頻繁的作為查詢條件欄位應該建立索引
- 唯一性太差的欄位不適合建立索引,儘管頻繁作為查詢條件,例如gender性別欄位
- 更新非常頻繁的欄位不適合作為索引
- 不會出現在where子句中的欄位不該建立索引
總結: 滿足以下條件的欄位,才應該建立索引.
a: 肯定在where條經常使用 b: 該欄位的內容不是唯一的幾個值 c: 欄位內容不是頻繁變化。