数据库索引的代价
“给这个查询加个索引”常被当成万能答案,但索引从来不是免费的。
读与写的交换
B-tree 索引让范围查询和等值查询变快,代价是每次插入、更新、删除都要维护额外的结构。写入密集的表如果挂了太多索引,吞吐会被拖慢,锁竞争和 WAL 体积也会增加。
CREATE INDEX CONCURRENTLY idx_posts_publishedON posts (published_at DESC)WHERE status = 'published';上面这个部分索引只覆盖已发布帖子,比给整张表建索引更小,也更贴合查询。但 仍然要付出构建时间和系统资源。
选择性与回表
低选择性的列单独建索引,往往不如组合索引。查询只取索引列时可以走覆盖索引;一旦需要回表,随机 I/O 又会出现。优化器是否使用索引,还取决于统计信息、数据分布和参数化查询。
我现在更愿意先看慢查询的实际执行计划,再决定索引,而不是凭感觉加。索引是给具体查询用的,不是给表“增加高级感”的装饰。


评论
登录后可以评论,也可以回复某条评论。
还没有评论
说说你的看法,或者指出文中没有说清的地方。