MySQL 5.6触发器性能下降

时间:2014-07-24 20:51:38

标签: mysql performance triggers insert

我有一个包含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()是一个返回最新日期时间的微小函数

任何想法或提示?

由于

1 个答案:

答案 0 :(得分:0)

main.ip_addr是一个latin1,uniq_ip.data是以utf方式进行的。将uniq_ip.data更改为latin1可将插入速率从50次插入/秒提高到1000次插入/秒。我猜latin1-&gt; utf8演员是一个cpu杀手