在一个字段上建立索引并在另一个字段上建立 "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)
上的复合索引可用于 where
和 order 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
.
假设我有一个包含三列的小型数据库:"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)
上的复合索引可用于 where
和 order 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
.