无论更新的字段如何,数据库更新都会强制重建索引吗?

Tom*_*Tom 2 mysql innodb index update

使用 MySQL (InnoDB),我知道索引会减慢 UPDATE 查询的速度。我想知道无论更新哪些字段,是否都会发生这种情况。

例如,如果我有一个包含 20 个字段的表,其中前 10 个在单个索引或覆盖索引中被引用,那么其他 10 个非索引字段的更新速度是否会受到影响?

Rol*_*DBA 5

首先,看看 InnoDB 架构(来自 Percona 的 CTO Vadim Tkachenko)

InnoDB 架构

当您更新索引列时,更改必须通过此架构迁移,如下所示:

  • 从Buffer Pool的Insert Buffer部分到ibdata1里面的Insert Buffer
  • 从缓冲池的脏页到表物理文件(.ibd文件)

如果您正在更新一个非索引列,唯一的瓶颈就是通过.ibd写入 I/O 线程将脏页中的更改刷新到文件中。非索引列不涉及索引更改缓冲。

如果您有 MySQL 5.5/5.6,您可能需要增加innodb_write_io_threadsinnodb_log_buffer_size以提高写入性能。