何时使用每个MySQL索引类型?
columns?
对于真正大的表,索引列会提高性能吗?
发布于 2009-10-04 20:40:08
主要的
主键(顾名思义)是表的主键,应该是一个列,该列通常用于选择该表的行。主键总是唯一的键(唯一的标识符)。主键不限于一列,例如在引用表(多对多)中,通常有一个包含两个或多个列的主键是有意义的。
独一无二
唯一的索引确保DBMS不接受此列的重复条目。你问“外键?”不是的!这是没有用的,因为外键在定义中很容易被重复(一对多,多对多)。
索引
其他索引可以放置在列上,这些列通常用于选择(和联接),这通常是外键的情况。在许多情况下,如果索引外键,SELECT (和JOIN)查询将更快。
但是请注意--正如SquareCog所阐明的--索引在对数据的任何修改中都会被更新,所以是的,添加更多的索引会导致INSERT/UPDATE性能的下降。如果索引没有更新,您将得到不同的信息,这取决于优化器是否决定在索引或原始表上运行查询--这是一种非常不理想的情况。
这意味着,您应该仔细评估索引的使用情况。在此基础上,有一件事是肯定的:必须避免未使用的指数。移除!
发布于 2009-10-04 20:52:32
我对MySQL并不那么熟悉,但是我相信在大多数数据库服务器中,以下内容都是正确的。索引是一种平衡树,用于允许数据库扫描表中给定的数据。例如,假设您有下表。
CREATE TABLE person (
id SERIAL,
name VARCHAR(20),
dob VARCHAR(20)
);如果您在“name”字段上创建了一个索引,这将在“名称”列的表中为该数据创建一个平衡树。平衡的树数据结构允许更快地搜索结果(请参阅http://www.solutionhacker.com/tag/balanced-tree/)。
但是,您应该注意,索引列只允许您搜索存储在数据库中的数据。例如:
这将无法对索引进行搜索,而是对表进行顺序扫描,在表中的每个列上调用UPPER():name行。
select *
from person
where UPPER(name) = "BOB";这也会产生以下效果,因为索引将从第一个字母开始排序。但是,将搜索词替换为"%B“将使用索引。
select *
from person
where name like "%B"发布于 2009-10-04 20:39:23
索引将提高大型表的性能。通常,主键有一个基于键的索引。通常是独一无二的。
将索引添加到用于搜索很多内容的字段(如街道名称或姓氏)中是很有用的,因为它将再次提高性能。不需要是独一无二的。
外键和唯一键更多的是为了保持数据的完整性。这样,您就不能拥有重复的主键,并且您的子表没有已被删除的父表的数据。
https://stackoverflow.com/questions/1517303
复制相似问题