使用索引优化mySQL数据库

时间:2011-01-16 21:16:36

标签: mysql query-optimization

我想知道,如果我为我的数据库的每个表中的每个字段添加一个索引,那么这会使我的查询运行得更快吗? 或者我是否必须分析我的查询并仅在需要时创建索引?

4 个答案:

答案 0 :(得分:3)

在每列上添加索引可能会使您的大多数查询更快,但这不一定是最好的方法。最好将索引调整为特定查询,使用EXPLAIN和性能测量指导您添加正确的索引。

特别需要了解何时不应对列进行索引,何时需要多列索引。

我建议阅读optimization of SELECT statements的MySQL手册,它解释了在什么条件下可以使用索引。

答案 1 :(得分:2)

您拥有的索引越多,插入/更新就越重。所以这是一个权衡。现在无法使用索引的选择查询将更快地进行,但如果您检查您正在加入哪些字段(或在哪里使用),您将无法进行那么多的交易

(当然,还有磁盘空间,但大多数时候我并不关心那个:))

答案 2 :(得分:0)

另一点是,MySql只能为查询使用单个索引,因此如果您的查询是

SELECT * FROM table WHERE status = 1 AND col1='foob' AND col2 = 'bar'

MySql将使用其中一个索引,并过滤掉其余读取表中数据的内容。

如果您有这样的查询,最好在(status, col1, col2)

上创建复合索引

答案 3 :(得分:-2)

在每个表中的每个字段上添加索引并不聪明。 您应该仅在您在排序的select OR中的WHERE子句中使用的列上添加索引。

通常,使用特定于SQL选择的多列索引可以获得最佳结果。

还有一些部分索引限制字段长度,也可以用来优化性能并减少索引站点。

每个不必要的索引都会在插入过程中减慢数据库的速度,因为在每个插入时,每个索引都必须更新。

您拥有的索引越多,数据损坏的可能性就越大。最后,索引会在磁盘上占用额外的存储空间,有时会占用很多空间。

MySQL也试图将索引保留在内存中。如果你有不必要的索引,那么MySQL会有一个很好的改变,最终会耗尽可用内存和不必要的索引,在这种情况下你的性能会下降很多。

创建正确类型的索引可能是最重要的一种优化技术。这就是为什么当有人问这样的事情时我觉得这是个玩笑。

这个问题只能由没有读过一本关于MySQL的书的人提出。只要得到一本好书并阅读,那么你就不必提出这样的问题了。