SELECT COUNT(*) FROM tablename; -- 秒級返回,即使千萬行
SELECT COUNT(*) FROM tablename WHERE ...; -- 明顯變慢
原因:MyISAM 表在元數據中維護精確行數,無 WHERE 時直接讀取元數據;有 WHERE 必須掃描索引/表過濾。
InnoDB:無精確行數統計,COUNT(*) 始終需掃描(聚簇索引或二級索引),但 8.0+ 並行掃描大幅提速。
SELECT COUNT(DISTINCT id) FROM tablename;
SELECT DISTINCT id FROM tablename;
SELECT DISTINCT id, type FROM tablename;
-- 返回 (id, type) 組合不重複的行,而非 id 不重複!
方案 A:GROUP_CONCAT (MySQL 4.1+)
SELECT id, GROUP_CONCAT(type) FROM tablename GROUP BY id;
方案 B:聚合函數併列
SELECT id, type, COUNT(DISTINCT id) FROM tablename GROUP BY id, type;
-- 返回 id 唯一的所有行,附帶計數列
WHERE 計數用 COUNT(*),MyISAM 秒出結果;InnoDB 考慮 SELECT COUNT(id) 走二級索引。COUNT(DISTINCT col),注意大表性能。DISTINCT col1, col2 = 元組去重。GROUP BY + 聚合函數 或 窗口函數(8.0+)。