索引会使数据库更新变慢吗?

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)进行更新时,创建索引会减慢更新速度,因为这是一些需要时间的额外工作。

1234563在 mycolumn 上。

所以从上面你可以说插入总是会慢一点

你也可以从上面说,带 where 子句的 delete 也会更快。

最后但并非最不重要的选择会更快!

索引的意义在于它们是一种折衷——你应该从发送到数据库的所有语句的平均视图中看到它们——当索引选择得很好时,它们将大大加快数据库访问速度。如果没有索引,大多数事情(选择、更新、删除)会慢得多。所以你真的不应该担心索引可能给插入带来的小幅减速。

如果您在更新时遇到性能问题,您应该首先检查更新的 where 子句是否会执行全表扫描,从而减慢更新速度!

【讨论】:

以上是关于索引会使数据库更新变慢吗?的主要内容,如果未能解决你的问题,请参考以下文章

thinkphp注解路由会变慢吗

匕首可以使android活动创建速度变慢吗?

不同列中的大量重复 sum(x) 是不是会使 Select 变慢?

同时用无线和vpn网速会变慢吗

高效的 DOM 选择技术 - 按属性选择会变慢吗?

XSLT document() :多次调用它会变慢吗?