在xxxxx项目中,有一个查询“用户近7天积分变动明细”的接口响应超过3秒。
定位:开启MySQL慢查询日志,发现一条SELECT * FROM points_log WHERE user_id = ? AND create_time BETWEEN ? AND ?。
分析:使用EXPLAIN发现type=ALL(全表扫描),rows扫描了20万行。
解决:创建联合索引(user_id, create_time),并改写查询只返回必要字段(避免SELECT *)。优化后type=ref,扫描行数下降到几十行,响应时间降到50ms。
同时我将该经验沉淀到团队开发规范中,要求所有范围查询必须带上索引字段。
ps:ALL、index、range、ref、eq_ref、const 这几个常见 type 的优先级。type=ref 是 MySQL 执行计划里的访问类型,代表非唯一索引的等值匹配。