问题:假设我有一个Orders
带有索引的表,如果我只想列出单个用户的订单,那么添加(UserId, CreatedTime)
是否重要?DESC
CreatedTime
例如:
SELECT *
FROM Orders -- Also potentially have row limit
WHERE UserId = @UserId
ORDER BY CreatedTime DESC;
我不明白的是,如果答案是肯定的,那么为什么 DB 不能简单地从底部开始向上移动,因为它已经知道了范围@UserId
?
另外,我同时使用 SQL Server 和 SQLite,因此我很想知道每个 DBMS 的答案是否不同。
我仍然不太了解SQL Server 索引 - 升序或降序,有什么区别?显然在 MongoDB 中,这并不重要(MongoDB 中的索引顺序重要吗?)。
回到上面的查询,即使我按降序列出所有用户及其相应的顺序CreatedTime
,为什么数据库不能这样做:
- 对于用户 #1,他们的行是从 #1 到 #10,因此以相反的顺序获取行 #1 到 #10。
- 对于用户 #2,他们的行是从 #11 到 #13,因此以相反的顺序获取行 #11 到 #13。
- ...
我甚至问过 AI,它只是告诉我从下往上获取速度较慢,没有进一步解释,即使我试图按下它。
在 SQLite 中,无论您按 CreatedTime 升序还是降序排序,都会使用索引。
鉴于:
两种排序的查询计划相同:
如果您对 user_id 进行范围查询,然后按 排序,则仅当按降序排序
user_id, created_time
时才会使用额外的临时表:created_time
对于此查询,您需要一个索引
created_time desc
:=>