mysql索引太多了?

时间:2010-11-07 22:56:32

标签: sql mysql indexing

我花了一些时间来优化我们当前的数据库。

我正在专门研究索引。

有几个问题:

  • 是否存在索引太多的事情?
  • 索引会加速什么?
  • 索引会减慢什么?
  • 何时添加索引是个好主意?
  • 何时添加索引是个坏主意?
  • 多个索引与多列索引的Pro和Con?

5 个答案:

答案 0 :(得分:128)

  

索引会加速什么?

数据检索 - SELECT语句。

  

索引会减慢什么?

数据操作 - INSERT,UPDATE,DELETE语句。

  

何时添加索引是个好主意?

如果您希望获得更好的数据检索性能。

  

何时添加索引是个坏主意?

在将会看到大量数据操作的表格上 - 插入,更新......

  

多个索引与多列索引的Pro和Con?

在索引列定义中从左到右处理覆盖索引(多个列上的索引)时,查询需要解决列的顺序。语句中的列顺序无关紧要,只有列1,2和3的列顺序 - 在使用索引之前,语句需要引用第1列。如果只有对第2列或第3列的引用,则不能使用1/2/3的覆盖索引。

在MySQL中,查询中每个SELECT /语句只能使用一个索引(子查询/ etc被视为一个单独的语句)。并且MySQL允许的每个表的空间量有限制。此外,在索引列上运行函数会使索引无效 - IE:

WHERE DATE(datetime_column) = ...

答案 1 :(得分:55)

我不同意这个问题的一些答案。

  

是否存在索引太多的事情?

当然。不要创建任何查询都不会使用的索引。不要创建冗余索引。使用pt-duplicate-key-checkerpt-index-usage等工具来帮助您发现您不需要的索引。

  

索引会加速什么?

  • 在WHERE子句中搜索条件。
  • 加入条件。
  • ORDER BY的一些案例。
  • GROUP BY的一些案例。
  • UNIQUE constraints。
  • FOREIGN KEY约束。
  • FULLTEXT搜索。

其他答案表明,INSERT / UPDATE / DELETE越慢,索引越多。这是真的,但是考虑到UPDATE和DELETE的许多用法也有WHERE子句,而在MySQL,UPDATE和DELETE也支持JOIN。索引可能会使这些查询受益,而不是弥补更新索引的开销。

此外,InnoDB会锁定受UPDATE或DELETE影响的行。他们称这种行级锁定,但它实际上是索引级锁定。如果没有索引缩小搜索范围,InnoDB必须锁定比您正在更改的特定行更多的行。它甚至可以锁定所有表中的行。这些锁会阻止其他客户端所做的更改,即使它们没有逻辑冲突。

  

何时添加索引是个好主意?

如果您知道在上述某种情况下需要运行一个可以从索引中受益的查询。

  

何时添加索引是个坏主意?

如果索引是另一个现有索引的左前缀,或者索引不帮助您运行任何查询。

  

多个索引与多列索引的Pro和Con?

在某些情况下,MySQL可以执行index-merge optimization,并且可以联合或交叉独立索引搜索的结果。但它提供了更好的性能来定义单个索引,因此索引合并不需要完成。

对于我的一位咨询客户,我在没有索引的多对多表上定义了一个多列索引,并将其连接查询改进了9400万!

根据优化所需的查询,设计正确的索引是一个复杂的过程。你不应该制定广泛的规则,例如"索引所有内容"或"索引任何内容以避免降低更新速度。"

另见我的演讲How to Design Indexes, Really

答案 2 :(得分:7)

  

是否存在索引太多的事情?

索引应该通过手头的问题来告知:表格,应用程序运行的查询等等。

  

索引会加速什么?

选择

  

索引会减慢什么?

INSERT会慢一些,因为你必须更新索引。

  

何时添加索引是个好主意?

当您的应用程序需要另一个WHERE子句时。

  

何时添加索引是个坏主意?

当您不需要它来查询或强制执行唯一性约束时。

  

多个索引与多列索引的优缺点?

我不明白这个问题。如果您具有包含多个列的唯一性约束,则无论如何都要对其进行建模。

答案 3 :(得分:4)

  

是否存在索引太多的事情?

是。不要外出寻找创建索引,根据需要创建索引。

  

索引会加速什么?

对索引表/视图的任何查询。

  

索引会减慢什么?

针对索引表的任何INSERT语句都将减慢,因为每个新记录都需要编入索引。

  

何时添加索引是个好主意?

当查询未以可接受的速度运行时。您可能正在过滤不属于群集PK的记录,在这种情况下,您应该根据要搜索的过滤器添加索引(如果性能认为合适)。

  

何时添加索引是个坏主意?

当你为它做 - 即过度优化。

  

多个索引与多列索引的Pro和Con?

取决于您尝试改进的查询。

答案 4 :(得分:3)

  

是否存在索引太多的事情?

是的,就像所有事情一样,太多的索引会减慢数据操作速度。

  

何时添加索引是个好主意?

添加索引的好主意是当您的查询太慢时(即您的查询中有太多连接)。只有在构建实体模型后才能使用此优化,以调整性能。