You need to enable JavaScript to run this app. MySQL大数据集分组统计:按Msisdn、ReqType计算成功失败计数及占比
优惠活动
大模型
产品
解决方案
定价
更多

MySQL大数据集分组统计:按Msisdn、ReqType计算成功失败计数及占比

MariaDB 大表分组统计正确实现方案

原查询缺陷说明:此前逻辑错误使用count(Success)同时作为成功、失败计数,本质是count()仅会统计字段非空的记录总数,无法区分Success字段的具体取值,会将所有非空Success的记录同时计入两个计数维度,最终输出的统计值完全失真。

核心统计逻辑说明

针对Success字段0/1的取值特征,采用单遍扫描条件聚合的实现方式,相比多次拆分查询成功、失败数据的方案,大数据集下仅需一次表扫描即可完成所有指标计算,IO和计算开销降低50%以上。

基础可用的统计SQL

直接在MariaDB中执行以下SQL即可获得符合要求的统计结果:

-- 注:可根据实际统计需求增加DateTime范围过滤,减少全表扫描量
SELECT
    Msisdn,
    ReqType,
    SUM(CASE WHEN Success = 1 THEN 1 ELSE 0 END) AS success_req_count,
    SUM(CASE WHEN Success = 0 THEN 1 ELSE 0 END) AS fail_req_count,
    SUM(CASE WHEN Success = 1 THEN 1 ELSE 0 END) + SUM(CASE WHEN Success = 0 THEN 1 ELSE 0 END) AS total_req_count,
    -- 成功率保留2位小数,单位为百分比,通过NULLIF避免总请求为0时的除零报错
    ROUND(
        SUM(CASE WHEN Success = 1 THEN 1 ELSE 0 END) 
        / NULLIF(
            SUM(CASE WHEN Success = 1 THEN 1 ELSE 0 END) + SUM(CASE WHEN Success = 0 THEN 1 ELSE 0 END),
            0
        ) * 100,
        2
    ) AS success_rate_pct,
    ROUND(
        SUM(CASE WHEN Success = 0 THEN 1 ELSE 0 END) 
        / NULLIF(
            SUM(CASE WHEN Success = 1 THEN 1 ELSE 0 END) + SUM(CASE WHEN Success = 0 THEN 1 ELSE 0 END),
            0
        ) * 100,
        2
    ) AS fail_rate_pct
FROM mark_db.Ntv_statistics
GROUP BY Msisdn, ReqType;

大数据集场景专属优化配置

为避免全量大表扫描导致的查询超时、资源占用过高问题,需配套以下优化措施:

  • 建立覆盖索引:在Ntv_statistics表上创建联合索引idx_ntv_group_stats (Msisdn, ReqType, Success),查询可直接通过索引完成聚合计算,无需回表读取磁盘上的原始行数据,可将大表聚合的查询性能提升数倍至数十倍
  • 简化语法提效:MariaDB原生支持布尔表达式直接计算为0/1的特性,可将冗长的CASE WHEN简化为直接求和的写法,与原逻辑执行效率完全一致,最终优化后的精简SQL如下:
    SELECT
        Msisdn,
        ReqType,
        success_req_count,
        fail_req_count,
        success_req_count + fail_req_count AS total_req_count,
        ROUND(success_req_count / NULLIF(success_req_count + fail_req_count, 0) * 100, 2) AS success_rate_pct,
        ROUND(fail_req_count / NULLIF(success_req_count + fail_req_count, 0) * 100, 2) AS fail_rate_pct
    FROM (
        SELECT
            Msisdn,
            ReqType,
            SUM(Success = 1) AS success_req_count,
            SUM(Success = 0) AS fail_req_count
        FROM mark_db.Ntv_statistics
        -- 建议强制索引走覆盖索引,避免优化器选错执行计划
        -- FORCE INDEX (idx_ntv_group_stats)
        GROUP BY Msisdn, ReqType
    ) AS base_agg_result;
    
  • 提前数据裁剪:如果统计范围不涉及全量历史数据,在GROUP BY前通过WHERE子句对DateTime字段做时间范围过滤,大幅缩小参与聚合的数据集规模
  • 结果落盘:如果单次统计返回的分组结果量过大,可将统计结果写入单独的结果表,避免直接返回海量数据导致的客户端内存溢出

内容的提问来源于stack exchange,提问作者mark

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.11.09 22:27:02