如何使用MySQL索引列?

时间:2009-10-04 20:30:20

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

您何时使用每种MySQL索引类型?

  • PRIMARY - 主键列?
  • UNIQUE - 外键?
  • INDEX - ??

对于非常大的表,索引列是否可以提高性能?

5 个答案:

答案 0 :(得分:20)

主要

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

唯一

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

索引

可以将附加索引放在通常用于SELECTS(和JOINS)的列上,这通常是外键的情况。在许多情况下,如果外键被索引,SE​​LECT(和JOIN)查询将更快。

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

这意味着,您应该仔细评估指数的用法。有一点可以肯定的是:必须避免使用未使用的指数。除去

答案 1 :(得分:3)

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

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

如果您在“名称”字段上创建了索引,则会在名称列的表格中为该数据创建一个平衡树。平衡树数据结构可以更快地搜索结果(参见http://www.solutionhacker.com/tag/balanced-tree/)。

您应该注意,然而索引列只允许您搜索数据,因为它存储在数据库中。例如:

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

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

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

select *
from person
where name like "%B"

答案 2 :(得分:2)

索引将提高较大表的性能。通常,主键具有基于键的索引。通常是独特的。

将索引添加到用于搜索批次的字段(如街道名称或姓氏)也很有用,这样可以提高性能。不需要是独一无二的。

外键和唯一键更适合保持数据的完整性。这样您就不会有重复的主键,因此您的子表没有已删除的父项的数据。

答案 3 :(得分:0)

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

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

INDEX为指定列创建索引,是的,它可以提高大型表的性能,如果使用索引,则可以更快地对此列中的内容进行排序和查找。

答案 4 :(得分:0)

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