【发布时间】:2011-05-04 14:31:17
【问题描述】:
我在 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 次。这是使用触发器的好地方,因为我不必担心汇总表与下划线表过时。
但是,为扩展插入中的每个值重建汇总表对性能的影响太大(有时我一次向程序添加数百个运算符)。我希望触发器在下划线表上执行扩展插入后运行一次。这可能吗?
【问题讨论】: