You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 08:36:03