demo table
创建表
create table test(
id int,
v1 int,
v2 int,
primary key(id))
Engine=InnoDB DEFAULT CHARSET=UTF8;
该表的记录如下:

问题一:如果一条sql同时命中两个索引,那实际会用几个索引?
添加两个索引:
ALTER TABLE
test
ADD INDEXidx_v1
(v1
) USING BTREE ,
ADD INDEXidx_v1_v2
(v1
,v2
) USING BTREE ;
通过 explain 来查看:

会命中两条索引,但实际只用了 idx_v1,即使实际查询用联合索引更好,也依然只用了 idx_v1。
问题二:如果命中两个索引,到底会用哪一个?
之前的测试,发现用的是第一个,我们删除索引,把之前的索引语句顺序换一下:
ALTER TABLE
test
ADD INDEXidx_v1_v2
(v1
,v2
) USING BTREE,
ADD INDEXidx_v1
(v1
) USING BTREE ;

发现用的是第一个。
结论
- 会依照索引添加的先后顺序,用最早添加的索引。即使是联合索引也依照这个规则。
网友评论