1000万行表统计仅含su1类型的id数量的其他SQL写法咨询
首先修正原写法的逻辑问题
你当前的查询存在逻辑漏洞:如果某个id对应多条记录,且所有记录的type均为su1,Having Count(*) = 1的条件会将这类合法id排除,不符合统计需求。
推荐写法1(性能最优,适合千万级大表)
用NOT EXISTS实现,可利用(id, type)联合索引提前终止无效匹配,无需全量分组聚合:
SELECT COUNT(DISTINCT t.id) FROM `table` t WHERE t.type = 'su1' AND NOT EXISTS ( SELECT 1 FROM `table` t1 WHERE t1.id = t.id AND t1.type != 'su1' );
如果已经建有(id, type)的联合覆盖索引,该查询可完全走索引扫描,无需回表访问主键数据,IO开销极低。
推荐写法2(简洁易读,适合id重复率低的场景)
直接按id分组,通过极值判断所有type均为su1:
SELECT COUNT(*) FROM ( SELECT id FROM `table` GROUP BY id HAVING MIN(type) = 'su1' AND MAX(type) = 'su1' ) t;
如果id去重后基数远小于总行数,该写法的执行效率也非常可观。
优化建议
将你现有的id单列非聚集索引调整为(id, type)联合非聚集索引,两种写法都能直接利用覆盖索引完成查询,千万级数据量下查询耗时可控制在秒级。
内容的提问来源于stack exchange,提问作者lifeisajourney
相关产品推荐
相关产品推荐

