2011-05-04 4 views
1

내가 UNION을 함께 세 개의 테이블로 구성되어 MySQL의에서보기가 화재를 유발 이 요약 테이블을 포함하는 인덱스를 통해 반환 할 수 있습니다에서 :MySQL은 너무 많이

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 
// 

나는 삽입, 업데이트에이 절차를 부착 요약 테이블을 구성하는 밑줄 테이블의 트리거 삭제 :

,691을

-program_operator_jct

-program_operator_group_jct

-operator_group_jct

예 :

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

:

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 
// 

여기 내가 program_operator_jct에 (5) 연산자를 추가 할 때 내 문제입니다 이 트리거는 (5) 실행됩니다. 시간, 나는 100 명의 연산자를 추가하면이 트리거가 100 번 실행됩니다. 밑줄 친 테이블과 구식 인 요약 테이블에 대해 걱정할 필요가 없기 때문에 이것은 트리거를 사용하기에 좋은 곳입니다.

그러나 확장 삽입의 각 값에 대한 요약 테이블을 다시 작성하는 것은 너무 많은 성능에 영향을 미칩니다 (때로는 한 번에 수백 명의 연산자를 프로그램에 추가하는 경우가 있음). 밑줄이 쳐진 테이블에서 확장 삽입이 수행 된 후에 트리거가 한 번 실행되기를 원합니다. 이것이 가능한가?

답변

4

트리거가 작업을 수행 중입니다 (예 : '각 줄마다'.

mysql이 마지막에 트리거를 한 번 실행하는 옵션을 제공한다고 생각하지 않습니다.

INSERT가 성공적으로 완료된 후 코드에서 저장 프로 시저를 호출합니다.

잊어 버릴 염려가있는 경우 cron 작업을 설정하여 매번 실행하십시오.

행운을 비네.

+0

시간 내 주셔서 감사합니다. –

+0

mysql 5.5 FAQ :'B.5.3 : MySQL 5.5에 문이나 단계의 트리거가 있습니까? MySQL 5.5에서 모든 트리거는 FOR EACH ROW입니다. 즉, 삽입, 업데이트 또는 삭제 된 각 행에 대해 트리거가 활성화됩니다. MySQL 5.5는 FOR EACH STATEMENT를 사용하는 트리거를 지원하지 않습니다 .' – Johan

관련 문제