2011-05-04 33 views
1

我有MySQL中的视图它是由三个表联合在一起:的MySQL引发火灾的次数太多

CREATE VIEW program_operator_jct_view AS 
select 
     program_id, 
     operator_code, 
     'PROGRAM_OPERATOR' AS type 
    from 
     program_operator_jct 
UNION 
    (select 
     program_id, 
     operator_code, 
     'PROGRAM_GROUP' AS type 
    from 
     program_operator_group_jct pg_jct, 
     operator_group_jct og_jct 
    where 
     pg_jct.group_id = og_jct.group_id) 

从这个观点,我创造了更高的性能,这是索引,以便我的结果汇总表从这个汇总表可以通过覆盖索引返回:

CREATE TABLE `program_operator_jct_summary` (
    `program_id` int(7) NOT NULL, 
    `operator_code` varchar(6) NOT NULL, 
    PRIMARY KEY (`program_id`,`operator_code`) 
) ENGINE=MyISAM DEFAULT CHARSET=latin1 


//BUILD SUMMARY PROCEDURE 
delimiter // 
CREATE PROCEDURE update_program_operator_jct_summary() 
BEGIN 
DELETE FROM program_operator_jct_summary; 
INSERT INTO program_operator_jct_summary select DISTINCT program_id, operator_code from program_operator_jct_view; 
INSERT INTO trigger_record (name) VALUES ('update_program_operator_jct_summary'); 
END 
// 

我重视这个过程,插入,更新和删除强调表从而弥补了汇总表的触发器:

-program_operator_jct

-program_operator_group_jct

-operator_group_jct

例:

delimiter // 
CREATE TRIGGER trigger_program_operator_jct_insert AFTER INSERT ON program_operator_jct 
FOR EACH ROW 
BEGIN 
CALL update_program_operator_jct_summary(); 
END 
// 

这里是我的问题,当我加入(5)运营商的program_operator_jct:

INSERT INTO program_operator_jct (program_id, operator_code) VALUES 
('112', '000500'), 
('112', '000432'), 
('112', '000501'), 
('112', '000264'), 
('112', '000184') 

这个触发器运行(5)次,如果我添加100个运算符,则此触发器运行100次。这是一个使用触发器的好地方,因为我不必担心汇总表与下划线表过期。

但是,为扩展插入中的每个值重建汇总表会带来太多的性能下降(有时候我会一次向程序添加数百个运算符)。我希望触发器在下划线表格上执行扩展插入后运行一次。这可能吗?

回答

4

触发器正在完成其工作,例如, '为每一行'。

我不相信mysql给你最后一次运行触发器的选项。

INSERT成功完成后,我会从代码调用存储过程。

如果您担心遗忘,请设置一个cron作业以便每隔一段时间运行一次。

祝你好运。

+0

谢谢你的时间阿兰。 – 2011-05-04 21:39:13

+0

从mysql 5.5 FAQ:'B.5.3:MySQL 5.5是否具有语句级或行级触发器?在MySQL 5.5中,所有触发器都是FOR EACH ROW - 也就是说,对于插入,更新或删除的每一行都会激活触发器。 MySQL 5.5不支持使用FOR EACH STATEMENT的触发器 – Johan 2011-05-30 15:08:37