实际案例—索引区分度

背景

数据库中有一张任务表

里面有百万千万数据,给 statsus 加了索引(考虑节约空间),正常只查询未完成状态数据,最多 1w 条,正常就是几百条

运行半年多,遇到白嫖用户大量提交任务,这类数据待执行有 20w+,当时表中数据有 400w 左右

下面 SQL 作用是查询当前执行中用户数量,然后均分每个用户最大任务数量

select nick from task where status = -1 group by nick

分析问题临时解决

MySQL 执行优化任务这类走扫表更加合适,然后 CPU 就 100%

临时去掉这块代码,恢复正常

最终解决方法

业务优化:在生产端限流,而不是消费限流

索引优化:status、nick 联合索引,不要心疼空间,出问题背上了跟着点空间相比,孰轻孰重