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 显示使用该索引,扫描行数与返回行数接近。