在mysql中使用INDEXES有什么好处?

时间:2011-04-17 22:30:59

标签: mysql indexing

我知道我需要设置一个主键,并设置任何唯一的键作为唯一键,但什么是INDEX以及如何使用它们?

有什么好处?优点&缺点?我注意到我可以使用它们,我应该什么时候使用它们?

7 个答案:

答案 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的速度。

然后,你的选择陈述也可能不够聪明 (对不起,答案的复杂性,我试图保持简单,但失败了。)

链接:
MySQL indexes - what are the best practices?

答案 1 :(得分:9)

优点:

更快地查找结果。这就是减少磁盘IO的数量。您可以通过使用B-TreesHash Indexes之类的索引结构来减少磁盘IO的数量(页面提取),而不是扫描整个表中的结果,以便更快地获取数据。

缺点:

  • 写入较慢(可能)。您不仅需要将数据写入表中,还必须写入索引。这可能会导致系统重组索引结构(哈希索引,B树等),这可能在计算上非常昂贵。

  • 自然占用更多磁盘空间。您正在存储更多数据。

答案 2 :(得分:3)

考虑索引的最简单方法是考虑字典。它有单词,并且有与这些单词对应的定义。字典有一个关于“单词”的索引,因为当你去字典时,你想快速查找一个单词,然后得到它的定义。字典通常只包含一个索引 - 按字索引。

数据库是类似的。当您在数据库中拥有大量数据时,您将拥有某些想要获取数据的方法。假设您有一个User表,并且您经常通过FirstName列查找用户。由于这是您在应用程序中经常执行的操作,因此应考虑在此列上使用索引。这将在数​​据库中创建一个结构,如果您愿意,通过该列进行排序,以便按名字查找某些内容就像在字典中查找单词一样。如果您没有此索引,则在确定哪些行具有特定的FirstName之前,可能需要查看所有行。通过添加索引,您可以快速完成此任务。

那么为什么不在所有列上放一个索引并使它们全部快速?像所有事情一样,有一个权衡。每次在表User中插入一行时,数据库都需要执行其魔法并对索引列上的所有内容进行排序。这可能很昂贵。

答案 3 :(得分:1)

没有主键。索引(任何类型)用于加速查询,并且至少使用InnoDB引擎强制执行外键约束。是使用唯一索引还是普通(非唯一)索引取决于是否要在密钥中允许重复值。

答案 4 :(得分:0)

这是一般数据库概念,您可以使用外部资源来阅读它,例如http://beginner-sql-tutorial.com/sql-index.htmhttp://en.wikipedia.org/wiki/Index_(database

答案 5 :(得分:0)

索引允许MySQL更快地查找数据。您可以在WHERE子句中使用的列上使用它们。例如,如果您有一个名为score的列,并希望查找score > 5所在的所有内容,则默认情况下这意味着MySQL需要扫描整个表以查找这些分数。但是,如果您使用BTREE索引,那么找到满足该条件的索引将会更快。

指数有价格:磁盘和内存空间。如果它是一个非常大的表,你的索引会变得相当大。

答案 6 :(得分:0)

以这种方式思考:在书中拥有索引的最大好处是什么?这是一回事。你有一本稍大的书,但你能快速查看。当您在列上创建索引时,您说您希望能够在where子句中引用它以快速查找它。