索引会使数据库更新变慢吗?
Posted
技术标签:
【中文标题】索引会使数据库更新变慢吗?【英文标题】:Do indexes make db updates slower? 【发布时间】:2014-03-20 23:42:47 【问题描述】:通常说,当您创建索引时,它会使您的获取速度更快,但同时它们会减慢您的更新(删除、插入、更新),因为每次更新索引都需要重新创建。
我有一个问题:如果数据库在更新操作后更新其索引并从查询返回,那么这会如何减慢查询执行速度?
在更新索引后,查询会在正常时间返回。我们可以说索引可能会增加数据库内部维护工作,但不应该增加更新查询时间。
【问题讨论】:
索引的维护和数据本身的更新是在同一个事务中完成的,因此调用者一直等到 both 完成(并且索引更新 必须 是事务性的,否则不同的会话可能会从索引查找中得到错误的答案)。但如果索引有where
子句,也可以加速更新或删除。
@a_horse_with_no_name 别害羞,把这个评论作为答案。
@a_horse_with_no_name 如果索引有 where 子句,您能解释一下如何加快更新或删除速度吗?
如果您指定where
子句,DBMS 需要找到由该条件选择的行。如果该搜索可以使用索引完成,它会快得多。考虑update foo set bar = 24 where id = 42
,如果id
列上没有索引,DBMS 需要扫描整个表以找到应该更新的行。
【参考方案1】:
数据库索引使数据库更新速度越来越慢。这取决于更新语句:
当您对所有行(如 update mytable set mycolumn = 4711
)进行更新时,创建索引会减慢更新速度,因为这是一些需要时间的额外工作。
所以从上面你可以说插入总是会慢一点
你也可以从上面说,带 where 子句的 delete 也会更快。
最后但并非最不重要的选择会更快!
索引的意义在于它们是一种折衷——你应该从发送到数据库的所有语句的平均视图中看到它们——当索引选择得很好时,它们将大大加快数据库访问速度。如果没有索引,大多数事情(选择、更新、删除)会慢得多。所以你真的不应该担心索引可能给插入带来的小幅减速。
如果您在更新时遇到性能问题,您应该首先检查更新的 where 子句是否会执行全表扫描,从而减慢更新速度!
【讨论】:
以上是关于索引会使数据库更新变慢吗?的主要内容,如果未能解决你的问题,请参考以下文章