请问 mysql 不使用索引排序的话改怎么优化

2018-11-14 14:44:57 +08:00
 cc959798

比如我们一条 sql

select * from tb where id=xxx order by create_time desc limt 0,20

id 和 create_time 都是有索引的

但是 where 限定里面使用的 id,就会走 id 这个索引了,但是我们业务上需要用 create_time 排序,因为要取前 20 条,这个 sql 怎么优化会快些呢?

另外不使用索引排序的话 mysql 是怎么排序的? 把结果集加载到内存中进行排序吗?

另外不使用索引排序的话一般会 using filesort 的,但是我 explain 一下的话结果发现没有这个,这是为什么呢

3042 次点击
所在节点    MySQL
8 条回复
xiaoxinshiwo
2018-11-14 16:30:11 +08:00
force index ?
wps353
2018-11-14 16:34:21 +08:00
add index idx_id_createtime(id,create_time)
cc959798
2018-11-14 16:45:21 +08:00
@wps353 额,有其他办法吗?另外不使用索引排序,mysql 就是在内存里排序的吗
ppyybb
2018-11-14 16:54:56 +08:00
是否加载到内存不好说,有可能进行外部排序,这个应该根据结果集的数据量来的。

你需要把 explain 所有的结果打出来,以及有的索引拿出来才好分析为什么没有 filesort。

你没有权限给数据库加索引,就看看 id=xxx 的数据量有多大,不是很大的话可以考虑自己全部加载回来到服务器上自己排序。或者有没有什么业务信息可以确实前 20 条的大致范围,这样可以过滤一部分再自己排序。

如果考虑不让它走 id 这个索引,那么考虑强制直接走 created 的索引效果应该不好,因为它需要把所有数据都排序,然后过滤对应的 id,大概率优化器不会采取这个 hint 的。
Raymon111111
2018-11-14 17:17:31 +08:00
尝试加一个索引 id, ctime

但是看起来你这个 id 对应的数据很多, 一般的方法基本都不会太好用 2333
msg7086
2018-11-15 01:45:53 +08:00
你没有 id,ctime 索引的话 MySQL 怎么去用 ctime 索引跑啊。如上面所说,先排序 ctime,然后扫全表过滤 id 吗?怕不是比你现在的还慢几个数量级哦。
agostop
2018-11-15 09:27:36 +08:00
没用 ctime,证明 mysql 认为用全表遍历比较快,可以试试 force index
agostop
2018-11-15 09:28:25 +08:00
你们 id 如果是自增的话,按道理用 id 也可以啊,除非你 ctime 是可以编辑的……

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

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

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

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

© 2021 V2EX