mysql使用order by会不会走索引?

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第5天,点击查看活动详情

使用数据库建立索引是必不可少的,面试中也会经常遇到一些有关于索引的问题,常见的就是问Mysql什么时候会造成索引失效,一般回答就是没有遵守b+ 树的最左原则,也有遇到过明明已经遵守了但是通过分析函数显示并没有走索引,这里就是使用order by 有走索引的情况也有不走索引的情况。

建表语句

CREATE TABLE `web_hot_spot_details` (
  `id` varchar(11) NOT NULL COMMENT '自增id',
  `title` varchar(255) DEFAULT NULL ,
  `extra` varchar(300) DEFAULT NULL ,
  `link` varchar(255) DEFAULT NULL ,
  `create_date` int(11) DEFAULT NULL ,
  KEY `title` (`title`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
复制代码

很平常的建表语句title 有建立索引,查询语句: select * from web_hot_spot_details order by title
通过分析语句查看执行计划如下

image.png 从上面的图中可以看出使用order by 索引字段是进行的全表扫描索引并没有走索引,但是使用下面这条sql 又会走索引。

image.png

分析

造成这种情况出现主要是因为索引树的原因

当查询字段为 '*' 的时候,虽然可以直接通过title 字段找到对应的叶子结点数据,但是在返回之前还得拿着这个去进行回表查询,表中有五个字段那么就需要进行五次回表查询,但是由于数据量并不是很大,所以Mysql就会直接把所有的数据扫描一遍然后拿到内存中进行排序,这样就不用进行回表的操作。

当查询字段为对应索引字段时候,可以直接通过索引拿到对应的返回字段,不需要进行回表操作,少了这一步操作速度就很快乐,再加上b+ 树的叶子结点是已经排好序的了,也不需要进行排序的操作。少了这两部操作mysql就会去走索引了。

总结

需要判断查询的返回字段是否被索引覆盖,如果全部被索引覆盖了那么就会走索引,如果没有全部覆盖mysql 就会根据数据量的大小来判断是否进行全表扫描或者先走索引再回表查询。

猜你喜欢

转载自juejin.im/post/7105041436852092941
今日推荐