按資料結構分類可分為:B+tree索引、Hash索引、Full-text索引,
按物理存盤分類可分為:聚簇索引、二級索引(輔助索引),
按欄位特性分類可分為:主鍵索引、普通索引、前綴索引,
按欄位個數分類可分為:單列索引、聯合索引(復合索引、組合索引),
一、按資料結構分類
MySQL索引按資料結構分類可分為:B+tree索引、Hash索引、Full-text索引,
| - | InnoDB | MyISAM | Memory |
| B+tree索引 | ? | ? | ? |
| Hash索引 | × | × | ? |
| Full-text索引 | ?(MySQL5.6+) | ? | ? |
注:InnoDB實際上也支持Hash索引,但是InnoDB中Hash索引的創建由存盤引擎引擎自動優化創建,不能人為干預是否為表創建Hash索引
二、按物理存盤分類
MySQL索引按葉子節點存盤的是否為完整表資料分為:聚簇索引、二級索引(輔助索引),全表資料存盤在聚簇索引中,聚簇索引以外的其他索引叫做二級索引,也叫輔助索引,
1. 聚簇索引
聚簇索引的每個葉子節點存盤了一行完整的表資料,葉子節點間按id列遞增連接,可以方便地進行順序檢索,

InnoDB表要求必須有聚簇索引,默認在主鍵欄位上建立聚簇索引,在沒有主鍵欄位的情況下,表的第一個非空的唯一索引將被建立為聚簇索引,在前兩者都沒有的情況下,InnoDB將自動生成一個隱式的自增id列,并在此列上建立聚簇索引,
以MyISAM為存盤引擎的表不存在聚簇索引,
MyISAM表中的主鍵索引和非主鍵索引的結構是一樣的,索引的葉子節點不存盤表資料,存放的是表資料的地址,所以,MyISAM表可以沒有主鍵,

MyISAM表的資料和索引是分開存盤的,MyISAM表的主鍵索引和非主鍵索引的區別僅在于主鍵索引的B+tree上的key必須符合主鍵的限制,非主鍵索引B+tree上的key只要符合相應欄位的特性就可以了,
2. 二級索引
二級索引的葉子節點并不存盤一行完整的表資料,而是存盤了聚簇索引所在列的值,

回表查詢
由于二級索引的葉子節點不存盤完整的表資料,索引當通過二級索引查詢到聚簇索引列值后,還需要回到聚簇索引也就是表資料本身進一步獲取資料,

回表查詢 需要額外的 B+tree 搜索程序,必然增大查詢耗時,
需要注意的是,通過二級索引查詢時,回表不是必須的程序,當SELECT的所有欄位在單個二級索引中都能夠找到時,就不需要回表,MySQL稱此時的二級索引為覆寫索引或觸發了索引覆寫,
可以用Explain命令查看SQL陳述句的執行計劃,執行計劃的Extra欄位中若出現Using index,表示查詢觸發了索引覆寫,
三、按欄位特性分類
MySQL索引按欄位特性分類可分為:主鍵索引、唯一索引、普通索引、前綴索引,
1. 主鍵索引
建立在主鍵上的索引被稱為主鍵索引,一張資料表只能有一個主鍵索引,索引列值不允許有空值,通常在創建表時一起創建,
2. 唯一索引
建立在UNIQUE欄位上的索引被稱為唯一索引,一張表可以有多個唯一索引,索引列值允許為空,列值中出現多個空值不會發生重復沖突,
3. 普通索引
建立在普通欄位上的索引被稱為普通索引,
4. 前綴索引
前綴索引是指對字符型別欄位的前幾個字符或對二進制型別欄位的前幾個bytes建立的索引,而不是在整個欄位上建索引,前綴索引可以建立在型別為char、varchar、binary、varbinary的列上,可以大大減少索引占用的存盤空間,也能提升索引的查詢效率,
四、按索引欄位個數分類
MySQL索引按欄位個數分類可分為:單列索引、聯合索引(復合索引、組合索引),
1. 單列索引
建立在單個列上的索引被稱為單列索引,
2. 聯合索引(復合索引、組合索引)
建立在多個列上的索引被稱為聯合索引,又叫復合索引、組合索引,
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/547560.html
標籤:MySQL
