Hai*_*ood 74 mysql sql indexing
我花了一些时间来优化我们当前的数据库.
我正在特别关注索引.
有几个问题:
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)
Bil*_*win 58
我不同意这个问题的一些答案.
是否存在索引太多的事情?
当然.不要创建任何查询未使用的索引.不要创建冗余索引.使用pt-duplicate-key-checker和pt-index-usage等工具来帮助您发现不需要的索引.
什么指数会加速?
其他答案表明INSERT/UPDATE/DELETE越慢,索引越多.这是真的,但考虑到UPDATE和DELETE的许多用法也有WHERE子句,而在MySQL,UPDATE和DELETE也支持JOIN.索引可能会使这些查询受益,而不是弥补更新索引的开销.
此外,InnoDB锁定受UPDATE或DELETE影响的行.他们称这种行级锁定,但它实际上是索引级锁定.如果没有索引缩小搜索范围,InnoDB必须锁定比您要更改的特定行更多的行.它甚至可以锁定表中的所有行.这些锁阻止了其他客户端所做的更改,即使它们在逻辑上没有冲突.
什么时候添加索引是个好主意?
如果您知道在上述某种情况下需要运行可从索引中受益的查询.
什么时候添加索引是个坏主意?
如果索引是另一个现有索引的左前缀,或者索引不帮助您运行任何查询.
Pro和Con的多个索引与多列索引?
在某些情况下,MySQL可以执行索引合并优化,并且可以联合或交叉来自独立索引搜索的结果.但它提供了更好的性能来定义单个索引,因此不需要完成索引合并.
对于我的一个咨询客户,我在没有索引的多对多表上定义了一个多列索引,并将其连接查询改进了9400万!
根据您需要优化的查询,设计正确的索引是一个复杂的过程.您不应该制定广泛的规则,例如"索引所有内容"或"索引任何内容以避免降低更新速度".
另请参阅我的演示文稿如何设计索引,真的.
是否存在索引太多的事情?
应该通过手头的问题通知索引:表格,应用程序运行的查询等.
什么指数会加速?
进行选择.
索引会减慢什么?
INSERT会更慢,因为您必须更新索引.
什么时候添加索引是个好主意?
当您的应用程序需要另一个WHERE子句时.
什么时候添加索引是个坏主意?
当您不需要它来查询或强制执行唯一性约束时.
多个索引与多列索引的优缺点?
我不明白这个问题.如果您具有包含多个列的唯一性约束,则无论如何都要对其进行建模.