【问题标题】:Should I set an index on the data covered by the multi-column index?我应该对多列索引覆盖的数据设置索引吗?
【发布时间】: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,以及对namesurname的查询。不需要额外的索引。但是,此复合索引适用于仅基于 surname 进行选择的查询 - 如果您有此类查询,您可能需要另一个索引(仅在 surname 上)

标签: sql database indexing


【解决方案1】:

不需要两个索引。单个复合索引将同时处理 namename/surname 的条件——只要 name 是索引中的第一列。

这在任何数据库中都应该是正确的。

MySQL 有相当不错的explanation 多列索引;它可能会帮助您更好地理解它们。

我应该注意,这是指 b-tree 索引,它是几乎所有支持索引的数据库中的默认和标准索引。它不一定适用于所有索引。例如,基于散列的索引没有这个属性。

【讨论】:

    猜你喜欢
    • 2011-01-01
    • 2011-02-19
    • 2017-03-19
    • 2020-07-29
    • 1970-01-01
    • 1970-01-01
    • 2020-01-24
    • 1970-01-01
    • 2013-01-03
    相关资源
    最近更新 更多