现有一表,行数为一千万。
内含三列 , 分别代表学生 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 秒时间进行排序是正常的,否则不正常。
谢谢
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.