我有一个MySQL数据库,每天有2百万个数据(行/天)在一个表中调用流。我编写了一个事务来读取和汇总表中的数据,以写入临时表(这里称为top_tcp_ports和top_udp_ports)。当我在Mysql控制台上执行事务查询时,通常需要30s或更少的时间来处理数据并将数据插入这两个表(top_tcp_ports & top_udp_ports)。但相反,当MySQL事件调度程序运行此事务时,需要7分钟来处理整个事务。该活动每1小时运行一次。这里的性能和时机正在考虑之中。 有没有办法提高mysql事件执行的性能?
DELIMITER |
CREATE EVENT IF NOT EXISTS top_tcp_udp_ports_hourly
ON SCHEDULE EVERY 1 HOUR starts CURRENT_TIMESTAMP
DO
BEGIN
INSERT INTO messages(message,created_at) VALUES('Start Event Execution Log ....',NOW());
CREATE TABLE IF NOT EXISTS top_tcp_ports
(
time_stamp datetime,
tcp_port mediumint(8) signed,
octetsTotal bigint(20) unsigned,
packetTotal bigint(20) unsigned
)ENGINE=MyISAM;
CREATE TABLE IF NOT EXISTS top_udp_ports
(
time_stamp datetime,
udp_port mediumint(8) signed,
octetsTotal bigint(20) unsigned,
packetTotal bigint(20) unsigned
)ENGINE=MyISAM;
start transaction;
SET @v1 := (select max(saved_max_id) from saved_id);
INSERT INTO top_tcp_ports (time_stamp, tcp_port, octetsTotal, packetTotal)
SELECT (timestamp(res2.date, maketime(res2.hour,00,00))), res2.tcp_port, res2.octetsTotal, res2.packetTotal from
(SELECT dt as date, hr as hour, tcp_port, sum(byt) as octetsTotal, sum(pkt) as packetTotal from
(
(SELECT -1 as tcp_port, sum(packetTotalCount+reversePacketTotalCount) as pkt, sum(octetTotalCount+reverseOctetTotalCount) as byt, date(CONVERT_TZ(flowEndMilliseconds,'UTC','SYSTEM')) as dt, hour(CONVERT_TZ(flowEndMilliseconds,'UTC','SYSTEM')) as hr FROM flows where protocol = 6 and CONVERT_TZ(flowEndMilliseconds,'UTC','SYSTEM')<DATE_FORMAT(now(),'%Y-%m-%d %H:00:00') and (SELECT @v1) < id group by dt, hr)
union
(SELECT srcport as tcp_port, sum(packetTotalCount+reversePacketTotalCount) as pkt, sum(octetTotalCount+reverseOctetTotalCount) as byt, date(CONVERT_TZ(flowEndMilliseconds,'UTC','SYSTEM')) as dt, hour(CONVERT_TZ(flowEndMilliseconds,'UTC','SYSTEM')) as hr FROM flows where protocol = 6 and CONVERT_TZ(flowEndMilliseconds,'UTC','SYSTEM')<DATE_FORMAT(now(),'%Y-%m-%d %H:00:00') and (SELECT @v1) < id group by srcport, dt, hr having byt > 1048576)
union
(SELECT dstport as tcp_port, sum(packetTotalCount+reversePacketTotalCount) as pkt, sum(octetTotalCount+reverseOctetTotalCount) as byt, date(CONVERT_TZ(flowEndMilliseconds,'UTC','SYSTEM')) as dt, hour(CONVERT_TZ(flowEndMilliseconds,'UTC','SYSTEM')) as hr FROM flows where protocol = 6 and CONVERT_TZ(flowEndMilliseconds,'UTC','SYSTEM')<DATE_FORMAT(now(),'%Y-%m-%d %H:00:00') and (SELECT @v1) < id group by dstport, dt, hr having byt > 1048576)
) as res
group by tcp_port, dt, hr) as res2;
INSERT INTO messages(message,created_at) VALUES('Mid_1 Event Execution Log ....',NOW());
INSERT INTO top_udp_ports (time_stamp, udp_port, octetsTotal, packetTotal)
SELECT (timestamp(res3.date, maketime(res3.hour,00,00))), res3.udp_port, res3.octetsTotal, res3.packetTotal from
(SELECT dt as date, hr as hour, udp_port, sum(byt) as octetsTotal, sum(pkt) as packetTotal from
(
(SELECT -1 as udp_port, sum(packetTotalCount+reversePacketTotalCount) as pkt, sum(octetTotalCount+reverseOctetTotalCount) as byt, date(CONVERT_TZ(flowEndMilliseconds,'UTC','SYSTEM')) as dt, hour(CONVERT_TZ(flowEndMilliseconds,'UTC','SYSTEM')) as hr FROM flows where protocol = 17 and CONVERT_TZ(flowEndMilliseconds,'UTC','SYSTEM')<DATE_FORMAT(now(),'%Y-%m-%d %H:00:00') and (SELECT @v1) < id group by dt, hr)
union
(SELECT srcport as udp_port, sum(packetTotalCount+reversePacketTotalCount) as pkt, sum(octetTotalCount+reverseOctetTotalCount) as byt, date(CONVERT_TZ(flowEndMilliseconds,'UTC','SYSTEM')) as dt, hour(CONVERT_TZ(flowEndMilliseconds,'UTC','SYSTEM')) as hr FROM flows where protocol = 17 and CONVERT_TZ(flowEndMilliseconds,'UTC','SYSTEM')<DATE_FORMAT(now(),'%Y-%m-%d %H:00:00') and (SELECT @v1) < id group by srcport,dt,hr having byt > 1048576)
union
(SELECT dstport as udp_port, sum(packetTotalCount+reversePacketTotalCount) as pkt, sum(octetTotalCount+reverseOctetTotalCount) as byt, date(CONVERT_TZ(flowEndMilliseconds,'UTC','SYSTEM')) as dt, hour(CONVERT_TZ(flowEndMilliseconds,'UTC','SYSTEM')) as hr FROM flows where protocol = 17 and CONVERT_TZ(flowEndMilliseconds,'UTC','SYSTEM')<DATE_FORMAT(now(),'%Y-%m-%d %H:00:00') and (SELECT @v1) < id group by dstport,dt,hr having byt > 1048576)
) as res
group by udp_port, dt, hr) as res3;
INSERT INTO messages(message,created_at) VALUES('Mid_2 Event Execution Log ....',NOW());
SET SQL_SAFE_UPDATES = 0;
update saved_id set saved_max_id=IFNULL((select max(id) from flows where id> (SELECT @v1) and CONVERT_TZ(flowEndMilliseconds,'UTC','SYSTEM')<DATE_FORMAT(now(),'%Y-%m-%d %H:00:00')),(SELECT @v1)) where row_id=1;
commit;
INSERT INTO messages(message,created_at) VALUES('End Event Execution Log ....',NOW());
END |
DELIMITER ;
此处的消息表用于跟踪事件级别的过程。
问题是如何提高MySQL事件的性能 调度或提升它?
有没有身体面对这个问题?
为什么你认为'EVENT'是瓶颈?就个人而言,我会将任何瓶颈归因于临时表! – bishop
@bishop因为我一步一步地测试了这个事务,Message表记录了这个事务的执行级别的步骤。此表中记录的时间显示事件调度程序的执行时间比在CONSOL中运行的时间长。另外{show processlist}和{innotop命令}显示每个事件查询的执行时间。 – omid
@bishop谢谢你,你正确的瓶颈不是事件调度器。 – omid