建立聯合索引后,數據庫會生成一顆B+樹,值是主鍵。
回表:從聯合索引表中查詢到數據后,在回到主鍵表查詢,避免數據冗余。
CREATE TABLE `t1` (
`id` int NOT NULL,
`a` int DEFAULT NULL,
`b` int DEFAULT NULL,
`c` int DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `index_bc` (`b`,`c`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci
先任意插入12條數據
第一種情況
上圖中查詢表所有字段時,條件c遵循最左前綴原則。在b+中查詢類似 *c,所以不使用索引查詢,使用全表掃描。
上圖中,查詢指定字段,並且遵循了最左原則,系統會自動優化。
范圍查詢時,當查詢的行數一旦過多,回表數量一旦增多,則不會使用索引。(系統內部自行判斷回表成本和全文掃描查詢成本)
索引列不應該作為表達式的一部分,一旦對列改變后,就不能使用索引查詢,對磁盤中的數據進行,會增大開銷。
order by 中索引
查找字段覆蓋索引字段
查找字段沒有覆蓋索引字段
一般情況下:where子句對於order 而言起到的是輔助作用
一般FileSort方式的查詢情況:
1、檢查的行數過多,且沒有使用覆蓋索引
2、使用了不同的索引,MySQL每回只采用一個索引
3、對索引列同時使用了ASC和DESC
4、where語句與order by語句,使用了不同的索引
需要先把a也設為索引
5、where語句或者ORDER BY語句中索引列使用了表達式
6、where 語句與ORDER BY語句組合滿足最左前綴,但where語句中使用了條件查詢
7、order by子句中加入了非索引列,且非索引列不在where子句中
8、order by或者它與where組合沒有滿足索引最左前列
9、當使用left join,使用右邊的表字段排序