如何在Grafana中高效获取无缺失值的MySQL性能测试数据
高效生成MySQL性能测试宽表(无嵌套子查询方案)
核心实现思路
利用条件聚合结合GROUP BY直接生成宽表,同时通过HAVING子句过滤掉缺失任意测量值的固件版本行,全程无需嵌套子查询,仅需一次表扫描,性能远优于子查询方案。
最终SQL语句
SELECT firmware_revision, ANY_VALUE(CASE WHEN inbound_traffic_size = '1B' THEN measurement_value END) AS traffic_1B, ANY_VALUE(CASE WHEN inbound_traffic_size = '500B' THEN measurement_value END) AS traffic_500B, ANY_VALUE(CASE WHEN inbound_traffic_size = '1000B' THEN measurement_value END) AS traffic_1000B FROM performance_test_data GROUP BY firmware_revision HAVING traffic_1B IS NOT NULL AND traffic_500B IS NOT NULL AND traffic_1000B IS NOT NULL;
关键优化点说明
条件聚合的优势:
每个CASE WHEN匹配对应流量大小的测量值,ANY_VALUE()(MySQL 5.7+支持)用于提取唯一匹配值(若每个固件+流量组合仅一条数据,用MAX()/MIN()也可),整个逻辑仅扫描一次数据表,避免子查询多次扫描的额外开销。HAVING过滤不完整行:
直接在聚合后通过HAVING检查三个流量的测量值是否都不为空,精准过滤掉像firmware_revision 1.6这类缺失数据的行,无需额外子查询筛选有效固件版本。索引优化建议:
若数据量较大,创建联合索引可进一步提升查询速度:CREATE INDEX idx_firmware_traffic ON performance_test_data(firmware_revision, inbound_traffic_size);该索引能让MySQL快速定位每个固件对应的三类流量数据,减少聚合时的排序和查找耗时。
内容的提问来源于stack exchange,提问作者Michal H
相关产品推荐
相关产品推荐

