mysql索引太多?


82

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

我正在专门查看索引。

有几个问题:

  • 索引太多了吗?
  • 索引将加速什么?
  • 索引会减慢什么?
  • 什么时候添加索引是个好主意?
  • 什么时候添加索引是个坏主意?
  • 多个索引与多列索引的优缺点

Answers:


148

索引将加速什么?

数据检索-SELECT语句。

索引会减慢什么?

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

什么时候添加索引是个好主意?

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

什么时候添加索引是个坏主意?

在将要进行大量数据操作的表上-插入,更新...

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

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

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

WHERE DATE(datetime_column) = ...

11
哇,这些信息的结构非常好,非常有用!对我最有用的是,在其上应用了函数的索引是无用的……谢谢您的回答!
克里斯(Chris)

2
@OMG,关于最后一段,select由于索引合并,每个索引可以使用多个索引。percona.com/blog/2012/12/14/...
Pacerier

1
-1表示(1)仅加速“ SELECT”,它将加速SELECT,UPDATE和DELETE查询,前提是根据“ WHERE”条件正确创建了索引,但是需要对数据操作进行索引更新,这意味着(在所有情况下)只有INSERT查询要比没有索引慢(2),因为MySQL一次只能使用一个索引。
Patrick Allaert

与@PatrickAllaert -1相同,用于提供有关更新,删除的误导性信息
Eimsas

64

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

索引太多了吗?

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

索引将加速什么?

  • WHERE子句中的搜索条件。
  • 加盟条件。
  • 一些ORDER BY的情况。
  • GROUP BY的某些情况。
  • 唯一约束。
  • 外键约束。
  • 全文搜索。

其他答案建议您插入的索引越多,INSERT / UPDATE / DELETE越慢。没错,但是考虑到UPDATE和DELETE的许多用法也有WHERE子句,在MySQL中,UPDATE和DELETE也支持JOIN。索引可能比弥补更新索引的开销更有益于这些查询。

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

什么时候添加索引是个好主意?

如果您知道您需要运行在上述情况之一中将从索引中受益的查询。

什么时候添加索引是个坏主意?

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

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

在某些情况下,MySQL可以执行索引合并优化,并合并或相交独立索引搜索的结果。但是,它提供了更好的性能来定义单个索引,因此无需完成索引合并。

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

根据您需要优化的查询,设计正确的索引是一个复杂的过程。您不应制定诸如“为所有内容编制索引”或“不编制任何索引以免减慢更新速度”之类的广泛规则。

另请参阅我的演示“如何真正设计索引”


10
为“ +1”表示“……考虑到UPDATE和DELETE的许多用法也有WHERE子句,在MySQL中,UPDATE和DELETE也支持JOIN。索引可以使这些查询受益,而不是弥补更新索引的开销。”
Rob Craig 2013年

1
对于在更新和删除中考虑了where子句的情况,这应该是公认的答案。
莱昂纳多·埃米利奥·多明格斯

1
这是正确的答案,标为正确的答案是错误的。
Eimsas

7

索引太多了吗?

索引应该由当前的问题告知:表,应用程序将运行的查询等。

索引将加速什么?

选择。

索引会减慢什么?

INSERT的速度会变慢,因为您必须更新索引。

什么时候添加索引是个好主意?

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

什么时候添加索引是个坏主意?

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

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

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


4

索引太多了吗?

是。不要外出寻找创建索引,必要时创建它们。

索引将加速什么?

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

索引会减慢什么?

针对索引表的所有INSERT语句都将变慢,因为每个新记录都需要建立索引。

什么时候添加索引是个好主意?

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

什么时候添加索引是个坏主意?

当您为此目的时-即过度优化。

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

取决于您要改进的查询。


3

索引太多了吗?

是的,就像所有事物一样,太多索引会减慢数据处理速度。

什么时候添加索引是个好主意?

添加索引的一个好主意是当查询速度太慢(即查询中的联接太多)时。只有在构建实体模型之后才能使用此优化来调整性能。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.