ALTER TABLE logs ADD INDEX idx_ab (user_id, status, created_at);
EXPLAIN SELECT * FROM logs
WHERE user_id = 1 AND status = 2
ORDER BY created_at DESC;

建了三个字段的联合索引,按后两个字段查询时 explain 依然全表扫描。这类现象通常不是突然出现的,往前翻半天日志能看到苗头。

追下去是这么回事:联合索引按定义顺序逐列匹配,跳过最左列就无法利用该索引。

「MySQL 联合索引」改完先别急着全量,挑一台机器放半天,真有问题这段时间就能看出来。同一份配置存在多处的,先确认改的是被加载的那一份。

新版本先放一台机器上跑一天再全量,问题一般在这段时间暴露。备份不是备了就行,恢复一次才算数,很多备份文件打开才发现是空的。

接口问题先分清是没发出去、发出去了没收到,还是收到了处理失败。偶发问题先统计频率,一小时几次和一天一次,查法完全不同。

处理上按这个顺序:查询条件包含最左列;范围查询列放在最后;按实际查询模式调整索引顺序。

确认没问题再收工,explain 显示使用该索引,扫描行数与返回行数接近。

作者 9823189