一.MySQL索引類型
1.普通索引:最基本的索引,沒有任何限制
2.唯一索引(unique index):索引列的值必須唯一,但是允許為空
3.主鍵索引:特殊的唯一索引,但是不允許為空,一般在建表的時候同時創建主鍵索引
4.組合索引:指多個字段上創建的索引,只有在查詢條件中使用了創建索引時的第一個字段,索引才會被使用。使用組個索引時遵循最左前綴集合
5.全文索引:主要用來查找文本中的關鍵字,而不是直接與索引中的值相比較
二.回表查詢
什么是回表查詢?
首先,從InnoDB說起,InnoDB的索引有兩種,聚集索引(clustered index)和普通索引(secondary index),聚集索引的葉子結點存儲的是行記錄,若表定義了PK,那么PK就是聚集索引(因此PK查詢非常快,直接定位行記錄),若表沒有定義PK,那么第一個not null unique列就是聚集索引。普通索引的葉子結點存儲的是主鍵值。
如:t(id PK, name KEY, sex, flag);id為聚集索引,name為普通索引
查詢
select * from t where name='lisi';
執行過程:
對於聚集索引,直接定位行記錄
對於普通索引,需要遍歷兩遍索引樹,如下圖所示,先通過普通索引定位到id,再通過聚集索引定位到行記錄。
這就是所謂的回表查詢,先定位主鍵值,再定位行記錄,性能比聚集索引低。
所以,避免回表查詢?
直接使用聚集索引(主鍵或者第一個唯一索引)即可。