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

时间:2015-01-16 01:45:54

标签: mysql innodb

我有下表

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;

该表的大约95%的查询都是读取

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

在剩下的5%的查询中,其中约99%是对得分列的更新

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

剩下的查询是插入

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

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

  • 当我运行update语句并且索引的score字段已更新时,到底发生了什么?
  • 有没有办法估计这次行动的大O?
  • 在更新期间,是否为每一行重新编制索引score
  • 在此更新期间是对队列中的行的读取,还是查询读取旧的score

1 个答案:

答案 0 :(得分:1)

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

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

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

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