当查询某张单表时,例如有一张person表,包含id,name,age,cid等字段列,其中name与age属于索引字段列,那么在select id,name,age,cid from person where name = ‘1610591638338’ and age = 21时,查看执行计划会出现以下三种情况

1、采用了name索引列

因为name列的离散型较高,在possible_keys中name,age这两列都会出现,但实际使用的索引是name,原因就是优化器会判断,哪个索引列的值离散性更大,会选取一个最优方案进行查询,说的再直白一点,就是电脑始终比不过人脑,计算机里就是非0即1的二进制。
image.png

2、采用了name,age索引列

在5.1及以后版本(网上野史)有一个index merge的优化,虽然计算机是非0即1,但是优化器也做了调整,发现两个索引离散型都不错,那么会采用2个索引分别去查询,最后根据查询条件,是要取交集、并集。
(Usingintersect(name,age); Using where)
image.png
Using union(name,age); Using whereimage.png

3、未使用索引

由于对索引列进行了计算,导致索引失效

image.png