索引的存在是为了跳过不需要的记录,减少记录扫描数,所以对于任何全表操作都是无效的。因为既然你的 SQL 需要每条记录都参与计算,那么索引就没有意义。 如果你需要频繁的更新 sum,同时数据量极大,那么每次都扫描全部记录肯定是不现实的,就算你做了读写分离,只读库的负载依旧会非常高。所以优化思路有两个: 1. 控制 SQL 的执行频率,让一个线程定时执行,并将结果放入缓存。好处是保持设计不过于复杂,缺点是在某种程度上牺牲了实时性; 2. 将计算方式改为增量,例如把 sum 值放在缓存里,设计专门的逻辑来对其增量更新。好处是能做到实时,缺点是增加了复杂性。 另外,为什么你要一次查全部用户呢?如果一次只查询一个用户,那么就不会有这个问题。