在一个字段上建立索引并在另一个字段上建立 "order by"

Indexing on a field and "order by" on another field

假设我有一个包含三列的小型数据库:"id1"、"id2" 和 "date"。 我在字段 "id1" 上索引我的数据库,因为它是一个经常被 select 编辑的字段(许多 select 查询是 运行,例如:其中 "id1" = 125548 ).

在我的某些特定查询中,我需要根据 table 中未编入索引的日期"字段对用户记录进行排序。我的好奇心是排序操作(基本上是日期字段上的排序操作)将在整个数据库上或仅在用户行(例如:125548)上为 运行,我根据 "id1" 字段 select .

下面是一个示例查询:

SELECT u 
FROM UserView u 
WHERE u.viewedId=:viewedId AND u.viewDate >=:dateLimit 
ORDER BY u.viewDate DESC

首先,假设您的查询真的很简单,您可以创建一个同时执行这两项操作的索引:

select . . 
from table t
where id1 = X
order by col2

table(id1, col2) 上的复合索引可用于 whereorder by

至于你的问题。一般情况下,会先进行过滤。可能有一些数据库会查看 table 的统计信息并说 "gosh, half the records have id1 and I have an index on col2 -- I'll use the index for the sort"。但是,没有数据库会对 所有 数据进行排序(与使用索引相反),然后再对其进行过滤。排序对少量数据更有效。

编辑:

您的查询:

SELECT u 
FROM UserView u 
WHERE u.viewedId=:viewedId AND u.viewDate >=:dateLimit 
ORDER BY u.viewDate DESC;

最佳索引为UserView(ViewId, viewDate)。假设 UserView 是一个 table(或者可能是一个只从一个 table 中选择的视图),那么这个索引应该同时用于 WHERE(两个子句)和ORDER BY.