SQL去重应据需求选DISTINCT或GROUP BY:DISTINCT适合单纯取唯一值,GROUP BY适合聚合或按多字段去重;务必为去重字段建索引,用EXPLAIN验证执行计划;复杂场景优先用窗口函数替代低效子查询。

SQL去重查询核心靠 DISTINCT 和 GROUP BY,但选对方法、加对索引、避开陷阱,才能真正高效。不是所有“去重”都该用 DISTINCT,也不是 GROUP BY 一定比它慢。
用 DISTINCT 还是 GROUP BY?看需求再决定
DISTINCT 适合单纯取唯一值,语义清晰、写法简单;GROUP BY 更适合需要聚合计算(如 COUNT、SUM)或按多字段组合去重的场景。
- 只要“姓名不重复”,用
SELECT DISTINCT name FROM users; - 要“每个城市最新一条用户记录”,就不能只靠 DISTINCT,得结合子查询或窗口函数
- 如果去重字段没索引,DISTINCT 在大数据量下会触发 filesort 或临时表,性能明显下降
避免全表扫描:给去重字段加索引
数据库对 DISTINCT 或 GROUP BY 的优化,高度依赖索引。尤其当去重字段出现在 WHERE 条件之后时,复合索引能大幅提速。
- 例如常执行
SELECT DISTINCT status, category FROM orders WHERE create_time > '2024-01-01';,建议建联合索引:(create_time, status, category) - 注意:NULL 值在多数索引中会被单独处理,含大量 NULL 的字段单独建索引效果有限
- 用
EXPLAIN检查执行计划,确认是否用了索引(key 列非 NULL,type 不是 ALL)
大数据量别硬扛:用 ROW_NUMBER() 替代低效子查询
当需要“每组取一条最新/最旧记录”时,容易写出带相关子查询的写法,性能极差。窗口函数更可控、更易读。
版权声明:除非特别标注,否则均为本站原创文章,转载时请以链接形式注明文章出处。
还木有评论哦,快来抢沙发吧~