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