gpt4 book ai didi

mysql - MySQL 5.6 触发器性能低下

转载 作者:行者123 更新时间:2023-11-29 03:34:25 24 4
gpt4 key购买 nike

我有一个包含 8000 万行的大表和一个更新其他两个表的触发器,它们都是 TokuDB。服务器正在运行 Percona 5.6

CREATE TABLE `main` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`timestamp` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
`ip_addr` varchar(50) NOT NULL DEFAULT '',
`username` varchar(255) NOT NULL DEFAULT ''.
PRIMARY KEY (`id`),
) ENGINE=TokuDB;

触发码是

if NEW.ip_addr <> "" THEN
-- get the current oldest date
-- set @maxdate := now();
set @maxdate := (select lastseen from uniq_ip where data = NEW.ip_addr);
INSERT INTO uniq_ip (`data`, `total`, `lastseen`)
VALUES (NEW.ip_addr, 1, NEW.timestamp, @subnet)
ON DUPLICATE KEY UPDATE total = total + 1, lastseen = latest_date(NEW.timestamp, @maxdate);
end if;
-- get all values in one go, its indexed some query comes from index.
if NEW.username <> "" THEN
-- get the current oldest date
set @maxdate := (select lastseen from uniq_username where data = NEW.username);

INSERT INTO uniq_username (`data`, `total`, `lastseen`)
VALUES (NEW.username, 1, NEW.timestamp)
ON DUPLICATE KEY UPDATE total = total + 1, lastseen = latest_date(NEW.timestamp, @maxdate);
end if;

uniq_username 和 uniq_ip 是

CREATE TABLE `uniq_ip` (
`data` varchar(42) NOT NULL,
`total` mediumint(4) unsigned NOT NULL DEFAULT '0',
`lastseen` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
PRIMARY KEY (`data`),
KEY `idx_lastseen` (`data`,`lastseen`)
) ENGINE=TokuDB DEFAULT CHARSET=ascii;


CREATE TABLE `uniq_username` (
`data` varchar(255) CHARACTER SET latin1 NOT NULL,
`total` mediumint(4) unsigned NOT NULL DEFAULT '0',
`lastseen` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
PRIMARY KEY (`data`),
KEY `idx_data_time` (`data`,`lastseen`)
) ENGINE=TokuDB DEFAULT CHARSET=utf8;

问题是在计算 timeseen 值时,负载下的批量插入在触发器的用户名部分完美运行。然而,函数的第一部分在处理 uniq_ip 表时将插入率从 800/s 降低到 30/s


设置@maxdate :=(从 uniq_ip 中选择 lastseen,其中数据 = NEW.ip_addr);

如果您设置为 get now(),它的速度很快(但不是正确的结果)。 uniq_username 和 uniq_ip 具有相同的结构和索引,无论您先处理哪个(用户名或 ip),触发器都会立即减慢速度,但只有上述语句会减慢触发器速度。

如果 uniq_ip 表是 TokuDB 或 InnoDB 并且默认字符集没有区别,则下面的问题不会激活插入语句或被注释掉。 Latest_date() 是一个返回最近日期时间的小函数

有什么想法或提示吗?

谢谢

最佳答案

main.ip_addr 是 latin1 而 uniq_ip.data 被转换为 utf。将 uniq_ip.data 更改为 latin1 可将插入率从 50 次插入/秒提高到 1000 次插入/秒。我猜 latin1->utf8 转换是 cpu killer

关于mysql - MySQL 5.6 触发器性能低下,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24943731/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com