问题描述
我正在围绕Zabbix MySQL(MariaDB)数据库构建Web应用程序。
我需要显示具有所有主机名的表和主机当前问题的列表,我执行以下sql查询(在一个http GET请求中,我执行了7个具有不同event.name值的此类sql查询,以检查所有可能的问题)为此:
SELECT distinct(hosts.hostid),max(CONVERT(CONCAT(events.eventid,events.value,events.severity),UNSIGNED))
FROM hosts
INNER JOIN hosts_groups ON hosts.hostid = hosts_groups.hostid
INNER JOIN hstgrp ON hosts_groups.groupid = hstgrp.groupid
INNER JOIN items ON hosts.hostid = items.hostid
INNER JOIN functions ON items.itemid = functions.itemid
INNER JOIN events ON functions.triggerid = events.objectid
WHERE events.name = %s
AND hstgrp.groupid = %s
AND hosts.status != 3 # 3 - not templates
GROUP BY hosts.hostid;
sql查询的总时间范围从20秒到120秒,我认为问题与事件表的大小以及新事件以非常快的速度添加到表有关。
我想我可以尝试为events.name列建立索引,但是恐怕它可能对Zabbix应用程序不利。另一个选择是分区,但是Zabbix有自己的分区规划方案,所以我也不敢这样做。
我还需要哪些其他选项来使查询工作更快,以及查询时间差异如此之大(最多6至7倍)的原因是什么?
编辑:
如果我限制活动时间,例如在最近10天之内,查询的工作速度更快,但是我放开了一些事件,因为错误事件可能在1个月前发生,并且从未解决过。
SELECT hosts.hostid,UNSIGNED))
FROM hosts
INNER JOIN hosts_groups ON hosts.hostid = hosts_groups.hostid
INNER JOIN hstgrp ON hosts_groups.groupid = hstgrp.groupid
INNER JOIN items ON hosts.hostid = items.hostid
INNER JOIN functions ON items.itemid = functions.itemid
INNER JOIN events ON functions.triggerid = events.objectid
WHERE events.eventid >= (select eventid from events where events.clock >= 1602773508 limit 1) AND events.name = "Устройство недоступно"
AND hstgrp.groupid = 15
AND hosts.status != 3 # 3 - not templates
GROUP BY hosts.hostid;
编辑
问题表的结果与事件表的结果相矛盾,被称为不可访问表的主机可通过ping进行访问,并且在zabbix接口中未标记为不可访问,请查询:
SELECT distinct(hosts.hostid) FROM hosts
INNER JOIN hosts_groups ON hosts.hostid = hosts_groups.hostid
INNER JOIN hstgrp ON hosts_groups.groupid = hstgrp.groupid
INNER JOIN items ON hosts.hostid = items.hostid
INNER JOIN functions ON items.itemid = functions.itemid
INNER JOIN problem ON functions.triggerid = problem.objectid
WHERE problem.name = "Device is unreachable"
AND hstgrp.groupid = 15
AND hosts.status != 3 ;
此外,我发现一台主机存在多个名称相同但时间(时钟)不同的问题,尽管我期望具体主机的指定名称最多出现一个问题:
SELECT hosts.hostid,problem.name,problem.clock FROM hosts
INNER JOIN hosts_groups ON hosts.hostid = hosts_groups.hostid
INNER JOIN hstgrp ON hosts_groups.groupid = hstgrp.groupid
INNER JOIN items ON hosts.hostid = items.hostid
INNER JOIN functions ON items.itemid = functions.itemid
INNER JOIN problem ON functions.triggerid = problem.objectid
WHERE problem.name = "Device is unreachable"
AND hstgrp.groupid = 15
AND hosts.status != 3 ;
问题表中一台主机的结果:
10398设备无法访问1603625463 10398设备无法访问1603630863 10398设备无法访问1603661463 10398设备无法访问1603679463 10398设备无法访问1603697463
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)