【发布时间】:2009-10-04 20:30:20
【问题描述】:
你什么时候使用每种 MySQL 索引类型?
- PRIMARY - 主键列?
- 唯一 - 外键?
- 索引 - ??
对于非常大的表,索引列会提高性能吗?
【问题讨论】:
标签: sql mysql indexing foreign-keys primary-key
你什么时候使用每种 MySQL 索引类型?
对于非常大的表,索引列会提高性能吗?
【问题讨论】:
标签: sql mysql indexing foreign-keys primary-key
主键 - 顾名思义 - 表的主键,应该是通常用于选择该表行的列。主键始终是唯一键(唯一标识符)。主键不限于一列,例如在引用表(多对多)中,主键包含两列或更多列通常是有意义的。
唯一索引可确保您的 DBMS 不接受此列的重复条目。你问'外键?不!这不会有用,因为外键根据定义容易重复(一对多,多对多)。
可以在经常用于 SELECTS(和 JOINS)的列上放置额外的索引,这通常是外键的情况。在许多情况下,如果对外键进行索引,SELECT(和 JOIN)查询会更快。
但是请注意 - 正如 SquareCog 所澄清的那样 - 索引会根据对数据的任何修改进行更新,所以是的,添加更多索引会导致 INSERT/UPDATE 性能下降。如果索引没有得到更新,您将获得不同的信息,具体取决于优化器是决定在索引还是原始表上运行您的查询——这是非常不受欢迎的情况。
这意味着,您应该仔细评估索引的使用情况。在此基础上可以确定一件事:必须避免使用未使用的索引。已删除!
【讨论】:
我对 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"
【讨论】:
索引将提高大型表的性能。通常,主键具有基于键的索引。通常是独一无二的。
将索引添加到用于搜索的字段也很有用,例如街道名称或姓氏,因为它会再次提高性能。不需要是唯一的。
外键和唯一键更有助于保持数据完整性。这样您就不能有重复的主键,并且您的子表没有已删除的父表的数据。
【讨论】:
PRIMARY 定义了一个主键,是的。
UNIQUE 只是定义了指定的字段必须是唯一的,它与外键无关。
INDEX 为指定列创建索引,是的,它提高了大型表的性能,如果您使用索引,在该列中排序和查找内容会更快。
【讨论】:
表越大,使用索引的好处就越大。请注意,索引会使插入(并且可能会更新)操作变慢,因此请确保您不要索引太多字段。
【讨论】: