有条很简单的 sql explain 后 extra 有不明白的,还望大家指点一二!

2020-09-18 14:31:26 +08:00
 aimaodeyuer
CREATE TABLE msg (
  id bigint(20) unsigned NOT NULL AUTO_INCREMENT,
  msg_id bigint(20) NOT NULL,
  status tinyint(4),
  content text NOT NULL,
  create_time datetime NOT NULL,
  PRIMARY KEY (id),
  KEY idx_msg_id (msg_id)
) ENGINE=InnoDB AUTO_INCREMENT=3048 DEFAULT CHARSET=utf8mb4

select id from msg where msg_id = #{param1} order by id desc limit 10;

显示走了 idx_msg_id 索引,extra 是 Using where; Using index 。 去掉 order by id 后 ,extra 是 Using index 。

PS:默认索引扩展 use_index_extensions=on

Q:既然 idx_msg_id 索引上有 id,且 select 只查询 id,order by id 为何会导致出现 Using where;

附上 mysql 官方文档:https://dev.mysql.com/doc/refman/5.7/en/index-extensions.html 看完也没弄明白。

891 次点击
所在节点    问与答
4 条回复
aimaodeyuer
2020-09-18 16:22:31 +08:00
阿,这么久了,没人吗?
tomy0608
2020-09-18 17:24:23 +08:00
按照文档上的意思, 就是在你开启了 index_extensions 之后, 会在你自建的索引基础上拓展一个类似联合索引的样子. 从你这个表来说就是 `index(msg_id, id)`.
执行器器在执行的时候能提高性能. 原话是这样的
```
The optimizer takes into account the primary key columns of the extended secondary index when determining how and whether to use that index. This can result in more efficient query execution plans and better performance.
```

但你这个实际跟这个没啥关系. `Using where` 表示 MySQL 服务器会在搜索引擎执行完之后再进行过滤操作.

在你没有 order by 时, 直接通过索引定位到了, 所以并不需要过滤操作.(可以这么认为)

但是你要排序(order by)的话, 是需要基于一个结果排序的, 这个结果便是 Using index 查出来的结果. (虽然你这查出来可能只有一个)
aimaodeyuer
2020-09-18 18:05:51 +08:00
@tomy0608 首先感谢老哥的解答,我先理解一波你的语义

但是你要排序(order by)的话, 是需要基于一个结果排序的, 这个结果便是 Using index 查出来的结果. (虽然你这查出来可能只有一个)

1.这个 msg_id 不是唯一键,是多值的。
2.idx_msg_id 索引是有 id 的值的所以不需要回表,而且是有序的,所以不需要额外的外部排序( Using filesort )
问题就是我还是不理解何来 using where 一说,不应该直接索引覆盖就完事了吗?
tomy0608
2020-12-15 16:05:29 +08:00
@aimaodeyuer 时隔 87 天....我回来了. 平时都在 stackoverflow 上....

我已经不好意思回复了... , 老哥你应该也用不到了 :-)

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/708291

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX