您何时使用每种MySQL索引类型?
对于非常大的表,索引列是否可以提高性能?
答案 0 :(得分:20)
主键是 - 顾名思义 - 表的主键,应该是一个通常用于选择该表行的列。主键始终是唯一键(唯一标识符)。主键不限于一列,例如在参考表(多对多)中,使主键包含两列或更多列通常是有意义的。
唯一索引可确保您的DBMS不接受此列的重复条目。你问'外键?'没有!这没有用,因为外键每个定义都容易出现重复(一对多,多对多)。
可以将附加索引放在通常用于SELECTS(和JOINS)的列上,这通常是外键的情况。在许多情况下,如果外键被索引,SELECT(和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)
表越大,使用索引的收益就越大。请注意,索引会使插入(并且可能更新)操作变慢,因此请确保不要索引太多字段。