我花了一些时间来优化当前数据库。
我正在专门查看索引。
有几个问题:
- 索引太多了吗?
- 索引将加速什么?
- 索引会减慢什么?
- 什么时候添加索引是个好主意?
- 什么时候添加索引是个坏主意?
- 多个索引与多列索引的优缺点
Answers:
索引将加速什么?
数据检索-SELECT语句。
索引会减慢什么?
数据操作-INSERT,UPDATE,DELETE语句。
什么时候添加索引是个好主意?
如果您想获得更好的数据检索性能。
什么时候添加索引是个坏主意?
在将要进行大量数据操作的表上-插入,更新...
多个索引与多列索引的优缺点
在处理覆盖索引(多个列的索引)时,查询需要解决列的顺序,即在索引列定义中从左到右。语句中的列顺序无关紧要,只有列1、2和3的顺序无关紧要-一条语句在使用索引之前需要引用第1列。如果仅引用第2列或第3列,则无法使用1/2/3的覆盖率索引。
在MySQL中,查询中的SELECT /语句只能使用一个索引(子查询/等被视为单独的语句)。MySQL允许的每个表的空间量是有限的。此外,在索引列上运行函数会使索引无用-IE:
WHERE DATE(datetime_column) = ...
select
由于索引合并,每个索引可以使用多个索引。percona.com/blog/2012/12/14/...
我不同意这个问题的一些答案。
索引太多了吗?
当然。不要创建任何查询都没有使用的索引。不要创建冗余索引。使用pt-duplicate-key-checker和pt-index-usage之类的工具来帮助您发现不需要的索引。
索引将加速什么?
其他答案建议您插入的索引越多,INSERT / UPDATE / DELETE越慢。没错,但是考虑到UPDATE和DELETE的许多用法也有WHERE子句,在MySQL中,UPDATE和DELETE也支持JOIN。索引可能比弥补更新索引的开销更有益于这些查询。
同样,InnoDB锁定受UPDATE或DELETE影响的行。他们称之为行级锁定,但这实际上是索引级锁定。如果没有索引来缩小搜索范围,则InnoDB必须锁定比您要更改的特定行多得多的行。它甚至可以锁定表中的所有行。这些锁会阻止其他客户端所做的更改,即使它们在逻辑上没有冲突。
什么时候添加索引是个好主意?
如果您知道您需要运行在上述情况之一中将从索引中受益的查询。
什么时候添加索引是个坏主意?
如果索引是另一个现有索引的左前缀,或者该索引不能帮助您运行任何查询。
多个索引与多列索引的优缺点
在某些情况下,MySQL可以执行索引合并优化,并合并或相交独立索引搜索的结果。但是,它提供了更好的性能来定义单个索引,因此无需完成索引合并。
对于我的一位咨询客户,我在一个没有索引的多对多表上定义了一个多列索引,并将其联接查询提高了9400万!
根据您需要优化的查询,设计正确的索引是一个复杂的过程。您不应制定诸如“为所有内容编制索引”或“不编制任何索引以免减慢更新速度”之类的广泛规则。
另请参阅我的演示“如何真正设计索引”。