SELECT COUNT(*) FROM tablename;
SELECT COUNT(*) FROM tablename WHERE status = 1;
WHERE 條件欄位有索引。SELECT COUNT(DISTINCT id) FROM tablename;
SELECT DISTINCT id FROM tablename;
SELECT DISTINCT id, type FROM tablename;
結果:(id, type) 組合去重,而非單獨 id 去重。若期望「每個 id 只取一列」,此寫法錯誤。
方案 A:GROUP_CONCAT (MySQL 4.1+)
SELECT id, GROUP_CONCAT(type) AS types
FROM tablename
GROUP BY id;
方案 B:聚合函數 + GROUP BY
SELECT id, type, COUNT(DISTINCT id) AS cnt
FROM tablename
GROUP BY id, type;
返回 id 唯一的所有組合,附帶計數欄位(可忽略)。
方案 C:視窗函數 (MySQL 8.0+)
SELECT id, type
FROM (
SELECT id, type, ROW_NUMBER() OVER (PARTITION BY id ORDER BY type) AS rn
FROM tablename
) t
WHERE rn = 1;
最標準、語意最清晰,效能亦佳。
| 場景 | 建議 |
|---|---|
| MyISAM 全表 COUNT(*) | 極快,直接用 |
| InnoDB 全表 COUNT(*) | 避免高頻呼叫;維護計數表或快取 |
| 帶 WHERE COUNT(*) | 確保條件欄位有索引 |
| COUNT(DISTINCT col) | 大表慎用;可考慮 HyperLogLog 近似計數 |
| 單欄去重帶其他欄位 | MySQL 8.0+ 用 ROW_NUMBER();舊版用 GROUP BY + 聚合 |