我想寻求帮助以创建针对某些问题的优化解决方案。当前的解决方案真的很糟糕而且很慢。
所以,这里是显示示例的最少数据量:
id | 地块名称 | 测量 | firmware_revision |
---|---|---|---|
1 | InboundTraffic1Byte | 300 | 1.5 |
2 | InboundTraffic500Bytes | 200 | 1.5 |
3 | InboundTraffic1000Bytes | 100 | 1.5 |
4 | InboundTraffic1Byte | 1.6 | |
5 | InboundTraffic500Bytes | 200 | 1.6 |
6 | InboundTraffic1000Bytes | 100 | 1.6 |
简而言之,有一个 MySQL 数据库存储性能测试的测量值,还有一个 Grafana,它有一些查询来获取绘图的特定数据。假设我有一个入站流量图,显示每个 firmware_revision 的 1B、500B 和 1000B 的所有 3 个入站测量值。所以情节上有 3 行。
在 Grafana 中,我需要获取包含 firmware_revision 和每种测量类型的列:
firmware_revision | 入站_1B | 入站_500B | 入站_1000B |
---|---|---|---|
1.5 | 300 | 100 | 200 |
1.6 | 200 | 100 |
我用这段代码得到它:
SELECT
firmware_revision,
(SELECT Measurement FROM db WHERE Plot_name like "InboundTraffic1Byte") as inbound_1B,
(SELECT Measurement FROM db WHERE Plot_name like "InboundTraffic500Byte") as inbound_500B,
(SELECT Measurement FROM db WHERE Plot_name like "InboundTraffic1000Byte") as inbound_1000B,
FROM
db
ORDER BY
id
现在我想删除缺少任何测量值的行。所以 firmware_revision 1.6 的整行应该消失了。 目前我通过在上面的代码中添加 WHERE 来做到这一点:
WHERE firmware_revision in (SELECT firmware_revision FROM db WHERE ... AND ... AND ... )
所以在......我有一个查询,检查firmware_revision是否在每个测量中。 如果缺少任何内容,则跳过该行。这个解决方案非常慢。你有其他想法吗?有没有更好的方法在不使用子查询的情况下为 Grafan 获取初始数据?
感谢您的帮助:)
有没有更好的方法让 Grafan 拥有这些初始数据而不用 使用子查询
您可以使用 CASE EXPRESSION 来完成,它比子查询更快:
SELECT
firmware_revision,
MAX(CASE WHEN Plot_name = 'InboundTraffic1Byte' THEN Measurement END) as inbound_1B,
MAX(CASE WHEN Plot_name = 'InboundTraffic500Byte' THEN Measurement END) as inbound_500B,
MAX(CASE WHEN Plot_name = 'InboundTraffic1000Byte' THEN Measurement END) as inbound_1000B
FROM
db
GROUP BY
firmware_revision
HAVING
inbound_1B IS NOT NULL AND inbound_500B IS NOT NULL AND inbound_1000B IS NOT NULL;
轻微的替代方法是
MAX
+ CASE
表达式)SELECT firmware_revision,
MAX(CASE WHEN Plot_name REGEXP '.*1Byte$'
THEN Measurement END) AS inbound_1B,
MAX(CASE WHEN Plot_name REGEXP '.*500Bytes$'
THEN Measurement END) AS inbound_500B,
MAX(CASE WHEN Plot_name REGEXP '.*1000Bytes$'
THEN Measurement END) AS inbound_1000B
FROM tab
WHERE Measurement IS NOT NULL
GROUP BY firmware_revision
HAVING COUNT(id) = 3
输出:
firmware_revision | 入站_1B | 入站_500B | 入站_1000B |
---|---|---|---|
1.5 | 300 | 200 | 100 |
在这里查看演示.