现有一表,行数为一千万。
内含三列 , 分别代表学生 ID, 插入时间,值
sid(int) ,stime(date), sgrade(int)
该表为 sid 和 stime 的复合索引。
执行如下语句
SELECT * FROM TABLE WHERE SID = 0
得到 5000 条数据,搜索时间 0.2 秒符合预期
然而希望将结果按时间排序时,
SELECT * FROM TABLE WHERE SID = 0 ORDER BY STIME DESC
执行时间变成 13 秒,显然不符合预期。我推测是因为 oracle 首先对全表进行 order 操作,而后从中取出 sid=0 的部分,导致速度变慢。
于是尝试用子查询:
SELECT * FROM (SELECT * FROM TABLE WHERE SID = 0) ORDER BY STIME DESC
执行时间 26 秒,不能理解原因
有没有大佬讲一下这个操作怎么实现,感觉 oracle 和 mysql 虽然都用 sql 语言写,但是差很多很多。
我的期望表现是,既然 0.2 秒能取出指定数据,那么再花 0.1 秒时间进行排序是正常的,否则不正常。
谢谢
1
liprais 2020-12-27 12:43:34 +08:00 via iPhone
你会看执行计划么
|
2
ayumilove 2020-12-27 13:26:47 +08:00
Explain Plan +1
|
3
LeeReamond OP |
4
noyidoit 2020-12-27 18:32:55 +08:00 via iPhone
@LeeReamond 好兄弟,先百度一下,如果看不懂再来问
|