更新索引字段时会发生什么?
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 (?, ?, ?)
我担心更新索引分数字段的速度很慢。
- 当我 运行 更新语句和索引
score
字段更新时究竟发生了什么?
- 有什么方法可以估计这个操作的大O吗?
- 是否
score
在更新期间为每一行重新编制索引?
- 在此更新期间,是读取队列中的行,还是查询读取旧的
score
?
至少从逻辑上讲,如果某行的得分值发生变化,则具有旧值的行的条目将从索引中删除,并插入具有新值的条目(反之亦然)反之亦然)。如果可以回滚更新(因此必须撤消更改),这可能会有点复杂。
平均而言,这与索引上的一次插入和一次删除操作一样复杂。
否;数据库尽量减少花费的精力。有时,删除或插入操作需要在索引中进行更剧烈的操作,例如节点拆分或合并,但仅在必要时进行,而不是针对每一行。
在更新期间,发生的情况可能取决于隔离级别和 InnoDB 的详细内部结构。其中,我不确定。
我有以下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 (?, ?, ?)
我担心更新索引分数字段的速度很慢。
- 当我 运行 更新语句和索引
score
字段更新时究竟发生了什么? - 有什么方法可以估计这个操作的大O吗?
- 是否
score
在更新期间为每一行重新编制索引? - 在此更新期间,是读取队列中的行,还是查询读取旧的
score
?
至少从逻辑上讲,如果某行的得分值发生变化,则具有旧值的行的条目将从索引中删除,并插入具有新值的条目(反之亦然)反之亦然)。如果可以回滚更新(因此必须撤消更改),这可能会有点复杂。
平均而言,这与索引上的一次插入和一次删除操作一样复杂。
否;数据库尽量减少花费的精力。有时,删除或插入操作需要在索引中进行更剧烈的操作,例如节点拆分或合并,但仅在必要时进行,而不是针对每一行。
在更新期间,发生的情况可能取决于隔离级别和 InnoDB 的详细内部结构。其中,我不确定。