我有下表
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 (?, ?, ?)
我担心更新索引得分字段的速度很慢。
score
字段已更新时,到底发生了什么?score
?score
?答案 0 :(得分:1)
至少逻辑上,如果行的分数值发生变化,则从索引中删除具有旧值的行的条目,并插入具有新值的条目(反之亦然)。如果可以回滚更新(因此必须撤消更改),这可能会有点复杂。
平均而言,这与索引上的一次插入和一次删除操作一样复杂。
没有;数据库尽量减少花费的精力。有时,删除或插入操作将需要在索引中执行更多戏剧性操作,例如节点拆分或合并,但仅在必要时,而不是每行。
在更新期间,会发生什么可能取决于隔离级别和InnoDB的详细内部。其中,我不确定。