【发布时间】:2011-08-07 12:03:03
【问题描述】:
我知道我需要设置一个主键,并将任何应该唯一的东西设置为唯一键,但什么是 INDEX 以及如何使用它们?
有什么好处?优点缺点?我注意到我可以使用或不使用它们,我应该什么时候使用?
【问题讨论】:
-
Markdown 吃掉了你的括号
我知道我需要设置一个主键,并将任何应该唯一的东西设置为唯一键,但什么是 INDEX 以及如何使用它们?
有什么好处?优点缺点?我注意到我可以使用或不使用它们,我应该什么时候使用?
【问题讨论】:
简答:
索引加快SELECT 的速度并减慢INSERT 的速度。
通常最好有索引,因为它们加快select 比减慢insert。
在UPDATE 上,如果在WHERE 子句中使用索引字段,则索引可以加快速度提升,如果您在update 索引字段之一中使用,则可以减慢速度。
您如何知道何时使用索引
在您的 SELECT 语句前面添加 EXPLAIN。
像这样:
EXPLAIN SELECT * FROM table1
WHERE unindexfield1 > unindexedfield2
ORDER BY unindexedfield3
将向您展示 MySQL 必须对每个未索引字段执行多少工作。
使用该信息您可以决定是否值得添加索引。
Explain 还可以告诉你是否更好地删除和索引
EXPLAIN SELECT * FROM table1
WHERE indexedfield1 > indexedfield2
ORDER BY indexedfield3
如果选择的行很少,或者 MySQL 决定忽略索引(它会不时这样做),那么您不妨删除索引,因为它正在减慢您的inserts,但不会加快您的selects。
再一次,也可能是您的 select 语句不够聪明。
(对不起,答案很复杂,我试图保持简单,但失败了)。
【讨论】:
优点:
更快地查找结果。这一切都是为了减少磁盘 IO 的数量。您可以通过使用诸如B-Trees 或Hash Indexes 之类的索引结构来减少磁盘IO(页面获取)的数量,而不是扫描整个表以获取结果,从而更快地获取数据。
缺点:
写入速度较慢(可能)。您不仅必须将数据写入表,还必须写入索引。这可能会导致系统重新构建索引结构(哈希索引、B-Tree 等),这可能在计算上非常昂贵。
自然会占用更多磁盘空间。您正在存储更多数据。
【讨论】:
考虑索引的最简单方法是考虑字典。它有词,并且有与这些词相对应的定义。字典有一个关于“单词”的索引,因为当你去字典时,你想快速查找一个单词,然后得到它的定义。字典通常只包含一个索引 - 一个单词索引。
数据库是类似的。当您在数据库中有一堆数据时,您将有某些方法可以将其取出。假设您有一个 User 表,并且您经常通过 FirstName 列查找用户。由于这是您在应用程序中经常执行的操作,因此您应该考虑在此列上使用索引。这将在数据库中创建一个结构,如果您愿意,按该列排序,以便按名字查找某些内容就像在字典中查找单词一样。如果您没有此索引,您可能需要先查看所有行,然后才能确定哪些行具有特定的 FirstName。通过添加索引,您的速度很快。
那么为什么不在所有列上都建立一个索引并让它们都快呢?像所有事情一样,有一个权衡。每次您在表 User 中插入一行时,数据库都需要执行其魔法并对索引列上的所有内容进行排序。这可能很昂贵。
【讨论】:
你没有有有一个主键。索引(任何类型)用于加速查询,并且至少使用 InnoDB 引擎强制执行外键约束。是使用唯一索引还是普通(非唯一)索引取决于您是否希望在键中允许重复值。
【讨论】:
这是一个通用的数据库概念,您可以使用外部资源来阅读它,例如 http://beginner-sql-tutorial.com/sql-index.htm 或 http://en.wikipedia.org/wiki/Index_(database)
【讨论】:
索引允许 MySQL 更快地找到数据。您可以在 WHERE 子句中使用的列上使用它们。例如,如果您有一个名为 score 的列,并且想要查找所有包含 where score > 5 的内容,默认情况下,这意味着 MySQL 将需要扫描整个表以查找这些分数。但是,如果您使用 BTREE 索引,找到满足该条件的索引会更快。
索引是有代价的:磁盘和内存空间。如果它是一个非常大的表,您的索引会变得相当大。
【讨论】:
这样想:在书中设置索引的最大好处是什么?这几乎是一样的。您有一本稍大的书,但您可以快速查找内容。当您在列上创建索引时,您是说您希望能够在 where 子句中引用它以快速查找它。
【讨论】: