如何构建最适合此SQL的索引?

如何构建最适合此SQL的索引?,sql,database,indexing,Sql,Database,Indexing,我通过一个简单的SQL查询数据库,如: SELECT DISTINCT label FROM Document WHERE folderId=123 我需要一个最好的索引 有两种方法可以实现这一点 (1) 创建两个索引 CREATE INDEX .. ON Document (label) CREATE INDEX .. ON Document (folderId) (2) 创建复合索引: CREATE INDEX .. ON Document (folderId, label) 根据数据

我通过一个简单的SQL查询数据库,如:

SELECT DISTINCT label FROM Document WHERE folderId=123
我需要一个最好的索引

有两种方法可以实现这一点

(1) 创建两个索引

CREATE INDEX .. ON Document (label)
CREATE INDEX .. ON Document (folderId)
(2) 创建复合索引:

CREATE INDEX .. ON Document (folderId, label)

根据数据库索引的实现。哪种方法更合理?谢谢。

答案也取决于使用的dbms。我不确定是否所有的dbms都支持使用多个索引

我认为组合索引(folderid,label)是您案例中最好的解决方案,因为它可以单独使用索引数据构建结果集。所以它甚至不需要访问真实的数据。 甚至可以将额外的列添加到索引中,这样一个称为lot的查询就可以只通过访问索引来回答。

您的第二个索引(复合索引)是此查询的最佳索引:

SELECT DISTINCT label
FROM Document
WHERE folderId = 123;
首先,索引覆盖查询,因此不需要访问数据页(在大多数数据库中)


该索引之所以有效,是因为引擎可以查找具有已识别的
folderId
的记录。可以提取标签上的信息。大多数数据库也应该使用索引来提取不同的标签。

这是您唯一的用例吗?也就是说,您的查询将始终是
WHERE folderId=…
,还是专门搜索标签,如
WHERE label='…
?我使用MS SQL Server。这是我唯一的用例。我认为综合指数更好。谢谢,谢谢。你的回答很有用。但我的名声很低。@zzzsleeper。作为OP,您可以接受这个(或任何其他)问题的答案。我使用MS SQL Server。你的回答很有用。但是我的名声很低。非常感谢。