在MySQL(尤其是InnoDB存储引擎)的业务系统中,针对“账户余额”或“库存数量”这种更新频率极高的字段建立索引,是一个典型的反模式(Anti-pattern)。 这样做不仅对查询性能帮助极小,反而会引发严重的性能和并发问题。具体隐患主要体现在以下几个方面: 1. 灾难性的索引维护成本(B+树频繁重构) 原理:MySQL的二级索引(辅助索引)是通过B+树实现的。当你更新一个被索引的字段时,数据库不仅要更新聚簇索引(数据行本身),还要去更新对应的二级索引B+树。 隐患:余额或库存的更新通常是无序的(例如:100 -> 90 -> 105 -> 80)。在B+树中,这会导致对应索引项被频繁地删除和插入。这种高频的随机变动会引发大量的页分裂(Page Split)和页合并(Page Merge),消耗大量的CPU和磁盘I/O资源,导致整个Update语句的耗时成倍增加。 2. 锁竞争加剧与并发能力骤降 页级别锁(Latch)竞争:在InnoDB维护B+树结构(如进行页分裂)时,需要对索引页加Latch(一种底层的读写锁)。在高并发更新时,多个事务争抢同一个索引页的Latch,会导致...