重要的話先說,今晚(3月20日)19:30 gt-checksum新版本發佈會,點擊下麵的鏈接預約: 會議詳情 (tencent.com) gt-checksum 1.2.0版本發佈後,受到了廣大社區用戶的熱烈響應。短短幾天,便有幾十個star,以及社區用戶提交了十幾條issue反饋問題,更有熱心用 ...
按數據結構分類可分為: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. 聯合索引(複合索引、組合索引)
建立在多個列上的索引被稱為聯合索引,又叫複合索引、組合索引。