为了账号安全,请及时绑定邮箱和手机立即绑定

mysql innodb 索引查询的一个疑问?

mysql innodb 索引查询的一个疑问?

隔江千里 2019-05-12 09:35:28
假设有这么个sql查询select*fromtablewhereid=xxxxorderbytime这张table上有两个索引,一个是id聚集索引,还有一个是time非聚集索引。那么我们假设强制它走time非聚集索引,那么执行这个sql的第一步就是直接把排序好的叶子节点拿出来。这个叶子节点的data域存放的是主键名,即id。那么问题来了,接下来要匹配where条件了,是直接在time索引的叶子节点的data域上来where匹配id,还是拿到id再去通过主键索引拿到行数据来where匹配id呢?思考:select*fromtablewheretime=xxxxorderbytime,会怎么样?如果上面那个问题的答案是前者(直接在time索引的叶子节点的data域上来where匹配id),那这句sql和上面那句sql的查询效率应该是差不多的?
查看完整描述

2 回答

?
MM们

TA贡献1886条经验 获得超2个赞

怎么查看你查什么第一条sql会在time索引找到满足where条件的id,然后拿着id去主键聚集获取其他字段第二条同样是在time索引上找到满足where条件的id,然后再去获取其他数据不同的是,第一种情况会遍历所有的time索引段,第二种只需要检索满足条件的time索引段即可
                            
查看完整回答
反对 回复 2019-05-12
?
哆啦的时光机

TA贡献1779条经验 获得超6个赞

EXPLAIN
SELECT`id`
FROM`table`
FORCEINDEX(`idx_time`)
WHERE`id`=xxx
ORDERBY`time`
看Extra有Usingindex,说明在索引内部完成了查询,也就是不需要回表查询
2条sql语句,不明白为什么要比较效率,第一条走主键效率肯定高;第二条语句,可能会扫描索引idx_time
                            
查看完整回答
反对 回复 2019-05-12
  • 2 回答
  • 0 关注
  • 409 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信