【问题标题】:Is it unnecessary to create additional indexes?是否不需要创建额外的索引?
【发布时间】:2018-07-08 13:01:57
【问题描述】:

如果我在一列上有一个唯一键,那是否就不需要在同一列上有一个额外的索引?

如果它是一个多列唯一键怎么办?这样就不需要在唯一索引列列表中的 FIRST 列上添加额外的索引了吗?

关于 SO 也有类似的问题,但我想在这个狭窄的背景下得到一个明确的答案。

【问题讨论】:

  • 好的。我会给你非常具体的答案,但以后不要要求进一步解释。我已经提到过,(un)necessary 这个词可能会因场景而异。但是,您似乎只期待“是”和“否”的答案。

标签: mysql indexing database-indexes


【解决方案1】:

如果我在一列上有一个唯一键,那是否就不需要在同一列上有一个额外的索引?

是的。 UNIQUE KEY 隐式创建索引。

如果它是一个多列唯一键怎么办?这样就不需要在唯一索引列列表中的 FIRST 列上添加额外的索引了吗?

是的。任何需要搜索第一列的查询都可以使用多列索引。

以此类推,如果我让您在电话簿中搜索名为“Smith, Sarah”的人,这就像您搜索包含两列的复合索引一样。如果我要求您使用同一个电话簿来搜索姓氏为“Smith”的人,那么第一列的排序顺序仍然有帮助,即使您不需要搜索第二列。

【讨论】:

    【解决方案2】:

    这样就不需要在同一个索引上添加额外的索引了吗? 列?

    是的。

    如果它是一个多列唯一键怎么办?

    是的,除了唯一索引之外,还可以再添加一些索引。


    ==详细说明==

    您应该记住,每次在您的桌子上执行 DML。它必须重组你的索引。所以,这完全取决于你正在实现什么以及你准备妥协什么。

    假设您正在使用某个数据库,其查询性能 (SELECT) 很慢。现在,您想到了创建索引,这最终提高了一些性能。所以,你认为,有这个索引是必要的。

    后来,过了一天,您开始发现在同一张表上执行任何 DML 操作时速度很慢。现在,取决于您准备包含的内容。这可以定义为对您来说是(非)必要的。

    8.3 Optimization and Indexes

    尽管为所有可能的情况创建索引可能很诱人 查询中使用的列,不必要的索引会浪费空间和时间 让 MySQL 确定要使用的索引。索引也添加到 插入、更新和删除的成本,因为每个索引必须 已更新。 您必须找到适当的平衡点才能使用以下方法实现快速查询 最优索引集。

    【讨论】:

    • @stepanian 如果我没记错那么这是你的问题would that make it unnecessary to have an additional index on the same column? 对吗?如果是这样,请阅读突出显示的粗体字体。
    • @stepanian 简短回答是“以粗体突出显示”。什么和在哪里都无所谓。这是昂贵的。如果你仔细阅读(慢慢地)。那你就明白它的真正含义了
    • @stepanian 如果您在同一列上制作,则没有必要,因为在幕后它使用 B-Tree 表示 (PRIMARY KEY, UNIQUE, INDEX, and FULLTEXT)。但是,如果它在不同的列上,那么您将再次妥协。
    • 谢谢。对于第二个答案,“是”,您的意思是在第一列上有一个额外的索引是不必要的,因为它被唯一的多列索引“覆盖”了吗?
    • @stepanian 将为第一列维护单独的索引。因此,即使多列再次覆盖同一列。然后,就可以了。我已经给出了适当的解释。但是,您对阅读用例不感兴趣。
    猜你喜欢
    • 2011-03-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-09
    • 1970-01-01
    • 1970-01-01
    • 2013-01-01
    • 1970-01-01
    相关资源
    最近更新 更多