2011-05-04 61 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