更新索引字段时会发生什么?

What happens when an indexed field is updated?

我有以下table

CREATE TABLE `posts` (
  `title` varchar(100) NOT NULL,
  `type` varchar(100) NOT NULL,
  `score` int(10) unsigned NOT NULL,
  PRIMARY KEY `post` (`title`,`type`),
  KEY `score` (`score`)
) ENGINE=InnoDB;

对 table 的大约 95% 的查询是读取

SELECT * FROM posts
WHERE title = ?
AND type = ?
ORDER BY score DESC
LIMIT 10

在对 table 的剩余 5% 的查询中,大约 99% 是对分数列的更新

UPDATE posts
SET score = ?
WHERE title = ?
AND type = ?

剩下的查询都是插入

INSERT INTO posts (title, type, score) 
VALUES (?, ?, ?)

我担心更新索引分数字段的速度很慢。

  1. 至少从逻辑上讲,如果某行的得分值发生变化,则具有旧值的行的条目将从索引中删除,并插入具有新值的条目(反之亦然)反之亦然)。如果可以回滚更新(因此必须撤消更改),这可能会有点复杂。

  2. 平均而言,这与索引上的一次插入和一次删除操作一样复杂。

  3. 否;数据库尽量减少花费的精力。有时,删除或插入操作需要在索引中进行更剧烈的操作,例如节点拆分或合并,但仅在必要时进行,而不是针对每一行。

  4. 在更新期间,发生的情况可能取决于隔离级别和 InnoDB 的详细内部结构。其中,我不确定。