每次插入新行时,数据库是否必须重建索引?
并且通过这个标记,如果我插入很多不是意味着,索引会不断重建,因此查询效率低/无用吗?
我正在尝试理解一些数据库理论,以便更好地进行数据库设计。
答案 0 :(得分:1)
是的,插入会影响它们,但它并不像你想象的那么糟糕。与关系数据库中的大多数实体一样,索引通常是通过额外的空间来创建和维护以适应增长,并且通常设置为在索引空间几乎耗尽时自动增加 的额外数量。
重建索引从头开始,与向索引添加条目不同。插入新行不会导致重建索引。新条目将添加到上面提到的额外空间中,除了运行方式略有不同的聚簇索引。
大多数数据库管理员还会执行一项名为“更新统计信息”的任务,该任务会更新查询计划程序使用的内部统计信息集,以提供良好的查询策略。该任务作为维护的一部分执行,还有助于使查询优化器与当前索引状态“保持一致”。
关于数据库如何工作的大量高质量参考资料,包括独立网站和主要数据库发布者的网站。你真的可以成为一名数据库专家。但是不要过分担心插件会造成麻烦。 ;)如果有疑问,请与您的DBA联系。
这有助于解决您的疑虑吗?
答案 1 :(得分:1)
更新绝对不需要在每次更新时重建整个索引(同样插入和删除)。
更新索引中的条目会带来一些开销,但成本相当低。大多数索引在内部存储为B+Tree data structure。选择此数据结构是因为它允许轻松修改。
MySQL还有一个名为Change Buffer的进一步优化。此缓冲区通过缓存更改来帮助降低更新索引的性能成本。也就是说,执行影响索引的INSERT / UPDATE / DELETE,并在更改缓冲区中记录更改类型。下次使用查询读取该索引时,MySQL会将更改缓冲区作为完整索引的一种补充。
这方面的一个很好的比喻可能是一份定期发布" errata"因此,您需要同时阅读文档和勘误表,以了解文档的当前状态。
最终,Change Buffer中的条目逐渐合并到索引中。这类似于在下次重新打印文档时编辑到文档中的勘误表。
更改缓冲区仅用于二级索引。它不会对主键或唯一键索引执行任何操作。对唯一索引的更新不能推迟,但他们仍然使用B +树,因此它们不会那么昂贵。
如果您执行OPTIMIZE TABLE或某些类型的ALTER TABLE更改无法就地完成,MySQL会从头开始重建索引。例如,在删除大量表后,这对于对索引进行碎片整理非常有用。