2011-04-17 82 views
14

我知道我需要一个主键集,并设置任何唯一的键作为唯一键,但是什么是INDEX,我该如何使用它们?在mysql中使用INDEXES最大的好处是什么?

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

+2

参考文献:[Wikipedia文章](http://en.wikipedia.org/wiki/Index_(数据库)) – 2011-04-17 22:33:59

+0

降价吃了你的括号 – 2011-04-17 22:35:21

回答

1

你不要有一个主键。索引(任何类型的)用于加快查询速度,至少在InnoDB引擎中实施外键约束。无论您使用唯一索引还是普通索引(非唯一索引),都取决于您是否希望在键中使用重复值。

0

索引可以让MySQL来查找数据更快。您可以在WHERE条款中使用的列上使用它们。例如,如果您有一个名为score的列,并且想要查找与score > 5之间的所有内容,默认情况下,这意味着MySQL需要扫描整个表以查找这些分数。但是,如果您使用BTREE索引,那么找到那些符合该条件的索引会更快地发生。

指数有一个价格:磁盘和内存空间。如果这是一张非常大的桌子,你的指数会变得相当大。

9

优点:

更快地查找结果。这是关于减少磁盘IO的数量的。您可以使用索引结构(如B-TreesHash Indexes)更快地获取数据,而不是扫描整个表以获取结果,从而减少磁盘IO的数量(页面提取)。

缺点:

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

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

0

想想这样:在书中有索引的最大好处是什么?这是一回事。你有一本稍大的书,但你可以快速查找的东西。在列上创建索引时,您希望能够在where子句中引用它以快速查找它。

3

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

数据库是类似的。当你在数据库中有一堆数据时,你会有一些你想要得到的方法。假设您有一个用户表,并且您经常通过FirstName列查找用户。由于这是您经常在应用程序中执行的操作,因此您应该考虑在此列上使用索引。这将在数​​据库中创建一个结构体,如果您愿意的话,在该列中进行排序,以便通过名字查找某些内容就像在字典中查找单词一样。如果你没有这个索引,你可能需要查看所有的行,然后再确定哪些具有特定的FirstName。通过添加一个索引,你已经做得很快。

那么为什么不把所有列的索引,并使他们都快?像所有事情一样,这是一种折衷。每次向表格中插入一行用户时,数据库都需要执行它的魔法并对索引列上的所有内容进行排序。这可能是昂贵的。

+0

所以,如果我的表非常大有许多行,最好不要使用它们,只使用PRIMARY KEY,但我的大多数WHERE子句只使用我的PRIMARY KEY。感谢您的回答。 – Basic 2011-04-17 22:41:18

+0

不一定 - 如果它有许多行,并且您确实需要通过主键以外的其他方式获取您的信息,那么您应该在该列上放置索引。如果人们不断地通过该专栏获取信息,那么它需要很快。 你只是不想随意添加索引,因为有后果 - 希望有所帮助! – skaz 2011-04-17 23:26:10

18

简短回答:
索引加快SELECT's并减缓INSERT's。

通常最好有索引,因为它们加速select多于它们减慢insert。如果你的索引字段的update一个

UPDATE如果索引字段是WHERE条款和慢下来的东西中使用的索引可以加快速度方式。

你怎么知道什么时候使用索引

添加EXPLAINSELECT语句的前面。
像这样:

EXPLAIN SELECT * FROM table1 
WHERE unindexfield1 > unindexedfield2 
ORDER BY unindexedfield3 

会告诉你多少工作,MySQL将不得不在每个索引字段做。
使用该信息可以决定是否值得添加索引。

解释也可以告诉你,如果它是更好地下降,指数

EXPLAIN SELECT * FROM table1 
WHERE indexedfield1 > indexedfield2 
ORDER BY indexedfield3 

如果很少选择行或MySQL决定忽略指数(它是不时)那么你也可以放弃索引,因为它放慢你的insert s,但不加快你的select的。

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

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

+0

我应该如何使用这个查询?:EXPLAIN SELECT * FROM table1 WHERE indexedfield1> indexedfield2 ORDER BY indexedfield3;我的意思是我知道要在indexedfield1上放什么,但那些indexedfield2和indexedfield3怎么样? – Viscocent 2014-04-30 07:21:36

相关问题