小编典典

在一个字段上建立索引并在另一个字段上进行“循序渐进”

sql

假设我有一个小型数据库,其中包含三列:“ 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

阅读 183

收藏
2021-04-28

共1个答案

小编典典

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

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

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

至于你的问题。通常,将首先进行过滤。可能有些数据库会查看该表的统计信息,并说“糟糕,记录有一半,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

2021-04-28