假设我有一个小型数据库,其中包含三列:“ id1”,“ id2”和“ date”。我在字段“ id1”上建立数据库索引,因为它是一个经常选择的字段(许多选择查询都使用ex来运行:其中“ id1” = 125548)。
在某些特定的查询中,我需要根据未建立索引的表中的“日期”字段对用户的记录进行排序。我的好奇心是如果对日期进行排序操作(基本上是按订单执行的操作)字段将在整个数据库上运行,或者仅在我根据“ id1”字段选择的用户行(例如:125548)上运行。
以下是查询示例:
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(id1, col2)
where
order by
至于你的问题。通常,将首先进行过滤。可能有些数据库会查看该表的统计信息,并说“糟糕,记录有一半,id1并且我有一个索引col2-我将使用索引进行排序”。但是,没有数据库会对 所有 数据进行排序(而不是使用索引),然后再对其进行过滤。排序对较小数量的数据更有效。
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。
UserView(ViewId, viewDate)
UserView
WHERE
ORDER BY