首页/数据/数据库速查/DISTINCT 去重与去重优化
本包目录(495 条)
MySQL 基础与连接36 条
SQL 语法52 条
用户与权限21 条备份与恢复56 条主从复制与高可用53 条性能与调优57 条Redis 命令96 条Redis 运维与场景124 条

DISTINCT 去重与去重优化

对结果集整行去重;本质是排序或哈希去重,昂贵。想对单列去重通常可以用 GROUP BY 或 EXISTS 改写。

数据库速查数据更新于 2026-10-12
用途结果集去重
语法SELECT DISTINCT 列1[, 列2] …
替代GROUP BY / 子查询 EXISTS

用法示例

用法示例
SELECT DISTINCT user_id FROM orders;
SELECT DISTINCT city, status FROM orders;
SELECT COUNT(DISTINCT user_id) AS uv FROM orders WHERE created_at >= '2026-10-01';

EXISTS 改写(大表更快)

EXISTS 改写(大表更快)
SELECT u.id FROM users u
WHERE EXISTS (SELECT 1 FROM orders o WHERE o.user_id = u.id);
COUNT(DISTINCT col) 很吃资源;如果 col 上有索引,优化器可以利用索引做松散扫描,否则会建临时表。

易错点

  • DISTINCT 作用于所有被选列的组合,不是只对第一列去重
  • DISTINCT 与 ORDER BY 混用且排序列不在选择列表时,8.0 会报错(sql_mode 影响)

数据来源与参考

  • MySQL 8.0 Reference Manual: SELECT - DISTINCT Clause

相关工具

​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌