[MySQL] ORDER BY 未能使用索引排序

2019-03-16 12:23:25 +08:00
 fuxinya

订单表建立了一个联合索引 index_order_store: [ store_id, create_time]

查询:

SELECT * 
FROM orders
WHERE store_id = 100001
ORDER BY orders.create_time DESC 
LIMIT 0,2

EXPLAIN 显示扫描了店铺的所有订单(扫描了 14 行),并没有使用索引排序。

SIMPLE	orders	ref	index_order_store	index_order_store	5	const	14	Using where

哪个地方错了

2366 次点击
所在节点    数据库
13 条回复
ilyh
2019-03-16 12:28:04 +08:00
全表才 14 行数据, mysql 会做优化, 直接全表扫描更快吧
fuxinya
2019-03-16 12:30:10 +08:00
@ilyh #1 我多造点数据试试
ilyh
2019-03-16 12:32:57 +08:00
type 为 ref 已经走了索引了啊...
ilyh
2019-03-16 12:37:20 +08:00
估计是 store_id = 100001 就有 14 行吧
kaid97
2019-03-16 12:46:29 +08:00
ref 就是使用了索引,而且返回值也只有一条
fuxinya
2019-03-16 12:52:34 +08:00
@ilyh #4 刚刚给店铺 100001 造了 100 条数据,又给另一个店铺也造了 200 条,查询结果:扫描了 100 行。现在的问题是虽然 store_id 走了那个联合索引,但是对 create_time 排序没有使用索引,SQL 语句中限制了条数:LIMIT 0,2。 但是却扫描了 100 行。期望是仅扫描 2 行。
难道是我认知错误了,ORDER BY 永远不会索引?
fuxinya
2019-03-16 12:53:50 +08:00
@kaid97 看下#6 我的回复,问题描述补充了一下
ilyh
2019-03-16 12:56:31 +08:00
不是 orderby 不走索引, 是 limit 是读到所有匹配行再保留第一行
polythene
2019-03-16 13:28:10 +08:00
用 force index 强制走索引吧
ToTChowChow
2019-03-16 13:29:25 +08:00
SELECT store_id, create.time
FROM orders
WHERE store_id = 100001
ORDER BY orders.create_time DESC
LIMIT 0,2

改成这样?
harde
2019-03-16 13:36:57 +08:00
歪个楼。。。。 在做这样的测试时,建议造个几十万条数据。。。 很多时候还是数据库聪明。
fuxinya
2019-03-16 13:40:42 +08:00
@harde 好的,马上试试。可能还是数据量不够,认为不走索引排序更快
constructor
2019-03-17 09:30:55 +08:00
原来和数据量有关系,我之前也有这样的疑问,一度误以为对索引的理解有偏差

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

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

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

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

© 2021 V2EX