mysql的关于in查询的索引问题

我有这么一张表,里面id是主键,name,age,idno三个字段的组合索引,abc字段和abc字段的普通索引,abcd字段和abcd字段的普通索引,

img

img

当我执行下面这段sql查看执行计划
EXPLAIN select id from user where id in(1,2)

img

此处为什么会使用到abcd索引呢?abc和abcd索引,的建立顺序 谁在前,此处就是使用的谁。

表结构 建的索引发出来看看

你肯定是把列名和索引名取的混乱了,并没有对应上
你这里显示的是abcd,但是前面显示它是主键索引
你abcd列的索引应该是unique类型才对呀
索引取名的时候,尽量使用前缀+列名的方式,不要随手取个跟列名一样的名字当索引,比如前缀用idx表示索引
其实你所有的列名也应该是前缀+列名的方式,比如用f_表示列,避免跟系统关键字混淆

你增加数据量再试试吧,记录条数增加到20条。
另外你可以直接把表的DDL信息发出来,比你截图包含的信息更详细。

经过讨论和验证之后,个人猜测之所以出现上述问题原因可能如下:
当我们把条件去掉之后 直接 select id from user
这个时候会发现还是走了一个普通索引,是和我们的查询字段是id主键有关,因为普通二级索引的叶子节点存放的就是主键id,所以当我们查询字段为id是,默认就会选择一个二级索引去扫描,最后拿到id。多个二级索引系统会怎么选择,根据我的验证情况应该是,选择第一个非组合索引的单字段索引。

img


新建一个字段 fa,不加索引 然后执行sql select id,fa from user

img

这时就会发现没有走任何索引的全表扫描,验证了上面的猜想,因为id在任意二级索引的子节点都存在,所以当只查询id,就会自动去扫描二级索引,但是如果查询字段里面包含无索引字段,则会全表扫描,同理如果查询字段包含了任意有索引的字段,则会使用该字段所在的索引

img


但是验证又发现,如果查询字段中包含多个索引字段,最后会变回全表扫描

img