1.我們先創建表
create table test( a int , b int, c int, d int, key index_abc(a,b,c) )engine=InnoDB default charset=utf8;
2.插入一些數據
DROP PROCEDURE IF EXISTS proc_initData;
DELIMITER $
CREATE PROCEDURE proc_initData()
BEGIN
DECLARE i INT DEFAULT 1;
WHILE i<=10000 DO
INSERT INTO test(a,b,c,d) VALUES(i,i,i,i);
SET i = i+1;
END WHILE;
END $
CALL proc_initData();
3.可以看到。我們建表的時候是設置了abc三列的組合索引。所以當我們
explain select * from test where a<10 ;
explain select * from test where a<10 and b <10;
explain select * from test where a<10 and b <10 and c<10;
可以看到數據庫都是走了索引的
而且我們執行
explain select * from test where b<10 and a<10;
也是會走索引的。因爲數據庫優化器幫我們進行了優化。其實真正執行時會按索引順序a<10 and b<10這種來執行的。
但是如果時
explain select * from test where b<10 and c <10;
這時候爲什麼沒有走索引了呢?最左前綴匹配原則是假設我們設置(name,age,id)順序爲索引時。name是建立索引樹的第一個比較因子,所以要現有name,才知道搜索方向。