需求
每天有很多数据需要汇总,之前是用select sum(money)...
来统计,当数据量上来时候往往会导致MySQL被阻塞。
解决方案
1、在程序中写入数据的时候同时往日报表里写(太简单了)
2、利用触发器
方法
CREATE TABLE `order` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(255) DEFAULT NULL,
`money` int(255) DEFAULT NULL,
`status` varchar(255) DEFAULT NULL,
`createAt` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`id`)
) ENGINE=MyISAM;
CREATE TRIGGER `report` AFTER INSERT ON `order` FOR EACH ROW
if not exists(select id from report_day where name=new.name and date=date(new.createAt)) then
--先判断是否存在数据,没有则插入
insert into report_day values(null,new.name,new.money,date(new.createAt));
else
--存在则更新
update report_day set money=money+new.money where name=new.name and date=date(new.createAt);
end if;
CREATE TABLE `report_day` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(255) DEFAULT NULL,
`money` varchar(255) DEFAULT NULL,
`date` date DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM;
测试
insert into `order` (name,money,status) values('a',200,0);
insert into `order` (name,money,status) values('a',100,0);
insert into `order` (name,money,status) values('b',10,0);
insert into `order` (name,money,status) values('b',20,0);
结果
数据表:
汇总表:
参考资料
[1] https://dev.mysql.com/doc/refman/5.5/en/create-trigger.html
[2] https://dev.mysql.com/doc/refman/5.5/en/trigger-syntax.html