我有一个包含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
set @maxdate := (select lastseen from uniq_ip where data = NEW.ip_addr);
如果你设置为get now(),它的速度很快(但不是正确的结果)。 uniq_username和uniq_ip具有相同的结构和索引,并且无论您首先处理哪个(用户名或IP),触发器都会向右减慢,但只有上面的语句会减慢触发器的速度。
如果uniq_ip表是TokuDB或InnoDB并且默认字符集没有区别,则插入语句既不活动也没有注释掉。 Latest_date()是一个返回最新日期时间的微小函数
任何想法或提示?
由于
答案 0 :(得分:0)
main.ip_addr是一个latin1,uniq_ip.data是以utf方式进行的。将uniq_ip.data更改为latin1可将插入速率从50次插入/秒提高到1000次插入/秒。我猜latin1-&gt; utf8演员是一个cpu杀手