【问题标题】:How to use MySQL index columns?如何使用 MySQL 索引列?
【发布时间】:2009-10-04 20:30:20
【问题描述】:

你什么时候使用每种 MySQL 索引类型?

  • PRIMARY - 主键列?
  • 唯一 - 外键?
  • 索引 - ??

对于非常大的表,索引列会提高性能吗?

【问题讨论】:

    标签: sql mysql indexing foreign-keys primary-key


    【解决方案1】:

    主要

    主键 - 顾名思义 - 表的主键,应该是通常用于选择该表行的列。主键始终是唯一键(唯一标识符)。主键不限于一列,例如在引用表(多对多)中,主键包含两列或更多列通常是有意义的。

    独特

    唯一索引可确保您的 DBMS 不接受此列的重复条目。你问'外键?不!这不会有用,因为外键根据定义容易重复(一对多,多对多)。

    索引

    可以在经常用于 SELECTS(和 JOINS)的列上放置额外的索引,这通常是外键的情况。在许多情况下,如果对外键进行索引,SE​​LECT(和 JOIN)查询会更快。

    但是请注意 - 正如 SquareCog 所澄清的那样 - 索引会根据对数据的任何修改进行更新,所以是的,添加更多索引会导致 INSERT/UPDATE 性能下降。如果索引没有得到更新,您将获得不同的信息,具体取决于优化器是决定在索引还是原始表上运行您的查询——这是非常不受欢迎的情况。

    这意味着,您应该仔细评估索引的使用情况。在此基础上可以确定一件事:必须避免使用未使用的索引。已删除

    【讨论】:

    • 索引会根据对数据的任何修改进行更新,所以是的,添加更多索引会导致 INSERT/UPDATE 性能下降。如果索引没有得到更新,您将获得不同的信息,具体取决于优化器是决定对索引还是原始表运行您的查询——这是非常不受欢迎的情况。
    【解决方案2】:

    我对 MySQL 不是很熟悉,但我相信以下内容适用于大多数数据库服务器。索引是一棵平衡树,用于允许数据库扫描表中的给定数据。例如,假设您有下表。

    CREATE TABLE person (
        id    SERIAL,
        name  VARCHAR(20),
        dob   VARCHAR(20)
    );
    

    如果您在“名称”字段上创建了索引,这将为名称列的表中的数据创建平衡树。平衡的树数据结构允许更快地搜索结果(请参阅http://www.solutionhacker.com/tag/balanced-tree/)。

    您应该注意,索引列仅允许您搜索存储在数据库中的数据。例如:

    这将无法搜索索引,而是对表进行顺序扫描,对表中的每个 column:name 行调用 UPPER()。

    select *
    from person
    where UPPER(name) = "BOB";
    

    这也会产生以下效果,因为索引将从第一个字母开始排序。但是,将搜索词替换为“%B”会使用索引。

    select *
    from person
    where name like "%B"
    

    【讨论】:

      【解决方案3】:

      索引将提高大型表的性能。通常,主键具有基于键的索引。通常是独一无二的。

      将索引添加到用于搜索的字段也很有用,例如街道名称或姓氏,因为它会再次提高性能。不需要是唯一的。

      外键和唯一键更有助于保持数据完整性。这样您就不能有重复的主键,并且您的子表没有已删除的父表的数据。

      【讨论】:

        【解决方案4】:

        PRIMARY 定义了一个主键,是的。

        UNIQUE 只是定义了指定的字段必须是唯一的,它与外键无关。

        INDEX 为指定列创建索引,是的,它提高了大型表的性能,如果您使用索引,在该列中排序和查找内容会更快。

        【讨论】:

          【解决方案5】:

          表越大,使用索引的好处就越大。请注意,索引会使插入(并且可能会更新)操作变慢,因此请确保您不要索引太多字段。

          【讨论】:

            猜你喜欢
            • 2019-01-24
            • 2021-01-13
            • 1970-01-01
            • 2012-01-30
            • 2011-04-18
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2022-09-27
            相关资源
            最近更新 更多