【发布时间】:2020-05-24 10:58:40
【问题描述】:
假设我有一个描述人的简单表格 - Persons。
这个表有三列:
Person_id, name, surname
我想在这个表上创建一个索引。我知道针对此表的查询将根据姓名 (WHERE name = 'sth') 和姓名和姓氏 (WHERE name = 'sth' AND surname = 'sth') 搜索人员。
所以我在(name, surname) 列上创建了索引。在这种情况下,我应该只在 (name) 列上添加一个附加索引吗?
【问题讨论】:
-
这可能取决于您使用的特定数据库。但是对于大多数使用 name 谓词的数据库来说,将使用 (name,surname) 上的索引。与通常不会使用该索引的 surname 谓词相反(oracle 可能使用 SKIP_SCAN 并使用该索引,即使未提供前导列)。如果存储是一个问题,您可能需要考虑甚至不根据您的用例对姓氏进行索引,如果它没有真正区分的话。
-
复合索引可用于指定索引的 n 最左侧列 的情况 - 因此
(name, surname)上的索引仅适用于两个查询name,以及对name和surname的查询。不需要额外的索引。但是,此复合索引不适用于仅基于surname进行选择的查询 - 如果您有此类查询,您可能需要另一个索引(仅在surname上)