更新feed为原值时,B-tree索引idx1、idx2是否无需重构以加快更新速度?
索引更新逻辑说明
针对你的场景,核心结论是:只有当索引包含的列的值实际发生变化时,B-tree索引才会执行更新重构操作。具体分析如下:
- 你的
idx1包含category、feed、create_time,idx2包含feed、create_time,两个索引都依赖feed列,而category和create_time在UPDATE语句中并未被修改。 - 当
function("attribute")计算出的feed值与该行原feed值完全一致时,两个索引涉及的所有列都没有实际变更,数据库不会对idx1和idx2做任何索引结构修改,此时更新操作的开销极低,速度会很快。 - 只有当
feed值确实被修改时,数据库才会删除索引中原条目并插入新条目到B树对应位置,此时才会产生索引重构的开销。
额外语法提示
你的UPDATE语句存在语法错误,多个字段赋值应该用逗号分隔而非AND,正确写法如下:
UPDATE "posts" SET "attribute" = 'something', "feed" = function("attribute") WHERE "id" = '123';
原写法会将attribute赋值为布尔表达式的结果,不符合你的预期,请及时修正。
内容的提问来源于stack exchange,提问作者Vince
相关产品推荐
相关产品推荐

