假设我有一个包含三列的小型数据库:" id1"," id2"和"日期"。 我正在我的数据库索引" id1"因为它是一个经常被选中的字段(许多选择查询是用ex:where" id1" = 125548)运行的。
在我的某些特定查询中,我需要根据日期"对用户的记录进行排序。表中没有索引的字段。我的好奇心是,日期字段上的排序操作(基本上是按订单操作)将在整个数据库上运行,还是仅在用户的行(例如:125548)上运行,我根据&#34选择; ID1"领域。
以下是一个示例查询:
SELECT u
FROM UserView u
WHERE u.viewedId=:viewedId AND u.viewDate >=:dateLimit
ORDER BY u.viewDate DESC
答案 0 :(得分:0)
首先,您可以创建一个可以同时执行这两个操作的索引,假设您的查询非常简单:
select . .
from table t
where id1 = X
order by col2
table(id1, col2)
上的综合索引可用于where
和order by
。
至于你的问题。通常,首先进行过滤。可能有一些数据库会查看表的统计信息并说“gosh,一半记录有id1
而我有col2
的索引 - 我将使用索引进行排序”。但是,没有数据库会对所有数据进行排序(而不是使用索引),然后对其进行过滤。对于少量数据,排序更有效。
编辑:
查询:
SELECT u
FROM UserView u
WHERE u.viewedId=:viewedId AND u.viewDate >=:dateLimit
ORDER BY u.viewDate DESC;
最佳指数为UserView(ViewId, viewDate)
。假设UserView
是一个表(或者可能只是从一个表中选择的视图),那么该索引应该用于WHERE
(两个子句)和ORDER BY
。< / p>