mysql索引太多了?

Hai*_*ood 74 mysql sql indexing

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

我正在特别关注索引.

有几个问题:

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

OMG*_*ies 131

什么指数会加速?

数据检索 - SELECT语句.

索引会减慢什么?

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

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

如果您觉得想要获得更好的数据检索性能.

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

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

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

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

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

WHERE DATE(datetime_column) = ...
Run Code Online (Sandbox Code Playgroud)

  • 哇,这些信息结构非常好,非常有用!对我来说最有帮助的是,应用函数的索引是无用的...谢谢你的答案! (9认同)
  • @OMG,关于你的最后一段,由于索引合并,每个`select`可以使用多个索引.http://www.percona.com/blog/2012/12/14/the-optimization-that-often-isnt-index-merge-intersection/ (2认同)

Bil*_*win 58

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

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

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

什么指数会加速?

  • 在WHERE子句中搜索条件.
  • 加入条件.
  • ORDER BY的一些情况.
  • GROUP BY的一些案例.
  • 独特的约束.
  • FOREIGN KEY约束.
  • FULLTEXT搜索.

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

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

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

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

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

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

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

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

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

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

另请参阅我的演示文稿如何设计索引,真的.

  • "...考虑到UPDATE和DELETE的许多用法也有WHERE子句,而MySQL,UPDATE和DELETE也支持JOIN.索引可能会使这些查询受益,而不是弥补更新索引的开销." (9认同)
  • 这应该是在更新和删除时考虑 where 子句的公认答案。 (2认同)
  • 这是正确答案,标记为正确的答案是错误的。 (2认同)

duf*_*ymo 7

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

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

什么指数会加速?

进行选择.

索引会减慢什么?

INSERT会更慢,因为您必须更新索引.

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

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

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

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

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

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