mysql太多索引?

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

我正在专门查看索引。

有几个问题:

  • 有没有索引太多的东西?
  • 什么索引加快?
  • 什么指标会慢下来?
  • 什么时候添加索引是个好主意?
  • 什么时候添加索引是一个坏主意?
  • Pro和Con的多指标与多列指标?

什么索引加快?

数据检索 – SELECT语句。

什么指标会慢下来?

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

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

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

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

在将看到大量数据操作的表格 – 插入,更新…

Pro和Con的多指标与多列指标?

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

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

WHERE DATE(datetime_column) = ... 

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

有没有索引太多的东西?

当然。 不要创build任何查询未使用的索引。 不要创build冗余索引。 使用像pt-duplicate-key-checker和pt-index-usage这样的工具来帮助你发现你不需要的索引。

什么索引加快?

  • 在WHERE子句中search条件。
  • join条件。
  • 一些ORDER BY的情况。
  • 一些GROUP BY的例子。
  • 独特的限制。
  • FOREIGN KEY约束。
  • FULLTEXTsearch。

其他答案build议,INSERT / UPDATE / DELETE越慢,索引越多。 这是真的,但考虑到UPDATE和DELETE的许多用途也有WHERE子句,在MySQL中,UPDATE和DELETE也支持JOIN。 索引可以使这些查询更有利于弥补更新索引的开销。

另外,InnoDB会locking受UPDATE或DELETE影响的行。 他们称之为行级locking,但实际上是索引级locking。 如果没有索引来缩小search范围,InnoDB必须locking更多行,而不是更改特定行。 它甚至可以locking表中的所有行。 这些锁可以阻止其他客户端所做的更改,即使这些更改不会发生逻辑冲突。

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

如果你知道你需要运行一个能从上面的例子中的索引中受益的查询。

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

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

Pro和Con的多指标与多列指标?

在某些情况下,MySQL可以执行索引合并优化 ,并且可以联合或相交独立索引search的结果。 但是,定义一个索引可以提供更好的性能,因此索引合并不需要完成。

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

根据您需要优化的查询来devise正确的索引是一个复杂的过程。 你不应该像“索引一切”或“索引什么都不要避免放缓更新”那样制定宽泛的规则。

另见我的介绍如何devise索引,真的 。

有没有索引太多的东西?

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

什么索引加快?

进行select。

什么指标会慢下来?

INSERT将会变慢,因为你必须更新索引。

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

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

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

当你不需要它来查询或强制唯一性约束。

多指标与多指标的优缺点

我不明白这个问题。 如果你有一个包含多列的唯一性约束,通过所有的手段来模拟它。

有没有索引太多的东西?

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

什么索引加快?

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

什么指标会慢下来?

任何针对索引表的INSERT语句都会变慢,因为每个新logging都需要编入索引。

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

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

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

当你这样做的时候 – 即过度优化。

Pro和Con的多指标与多列指标?

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

有没有索引太多的东西?

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

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

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