首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> MySQL 資料庫 >> MySQL 綜合教學

MySQL DISTINCT 與 COUNT(*) 使用陷阱與優化技巧

     編輯:MySQL 綜合教學

DISTINCT 常見用法

  1. 計數去重:SELECT COUNT(DISTINCT id) FROM t;
  2. 返回去重值:SELECT DISTINCT id FROM t;
  3. 多列去重陷阱:SELECT DISTINCT id, type FROM t; 返回 (id, type) 組合去重,非單列去重

多列去重解決方案

方案 1:GROUP_CONCAT(MySQL 4.1+)

SELECT id, GROUP_CONCAT(type) FROM t GROUP BY id;

方案 2:子查詢 + 計數輔助

SELECT id, type, COUNT(DISTINCT id) FROM t GROUP BY id;

返回 id 去重行,附帶計數列(可忽略)。

方案 3:直接 GROUP BY

SELECT id, type FROM t GROUP BY id;

MySQL 允許非聚合列不在 GROUP BY 中(唯一值不確定),生產環境建議開啟 ONLY_FULL_GROUP_BY 避免歧義。

COUNT(*) 性能特徵

優化建議

  • 頻繁 COUNT(*) 考慮維護計數表或 Redis 緩存
  • 大表分頁計數用 EXPLAIN 估算 rows 或覆蓋索引 COUNT(idx_col)
  • COUNT(DISTINCT col) 大數據量極慢,改用 GROUP BY 子查詢
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
場景MyISAMInnoDB
COUNT(*) 無 WHEREO(1) 直接讀表統計全表掃描(MVCC 可見性檢查)
COUNT(*) WHERE ...全表掃描全表掃描
COUNT(col)掃描統計非 NULL 值同左