mysql的执行计划为啥两张差不多的表一样的查询方式,访问类型却不一样?

img


问下,有两张这样的表。我用执行计划分别查询
select * from actor where id > 1
select * from film where id > 1
为啥这两个sql语句的访问类型不一样?actor是range,film是index

第一个actor的id列并没有索引,因此查询时需要逐行扫描整个表进行条件过滤,所以叫Range Scan。第二个SELECT * FROM film WHERE id > 1,执行计划中的访问类型是Index。 这是因为表film的id列是主键,还有一个idxname的索引。由于主键列上自带唯一索引,因此在执行查询时可以直接利用该索引进行条件过滤,这就是index。

actor表只有一个主键索引,其他字段没有索引,film有一个主键索引,name列有一个普通索引。

执行“select * from actor where id > 1”时,会走id索引,但是因为还需要查非主键的字段,且其它字段不是索引,所以会有个回表查询。根据索引查询范围数据,且回表查询,故type=range。
执行“select * from film where id > 1”时,会走id索引,但是其它字段也是索引,所以不会有回表查询,而是去查name的索引。根据主键索引和name索引就能查询出你想要的结果,故不会有回表查询。根据索引查询范围数据,且不回表查询(只通过索引就查出了结果),故type=range。但这时type却=index,是因为数据库会自己根据实际情况做些优化,多添加点数据效果就变了。

望采纳,关注我,持续回答。

您好,我是有问必答小助手,您的问题已经有小伙伴帮您解答,感谢您对有问必答的支持与关注!
PS:问答VIP年卡 【限时加赠:IT技术图书免费领】,了解详情>>> https://vip.csdn.net/askvip?utm_source=1146287632不知道你这个问题是否已经解决, 如果还没有解决的话:

如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^