MySQL запускает слишком много раз - PullRequest
1 голос
/ 04 мая 2011

У меня есть представление в 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 раз.Это хорошее место для использования триггеров, потому что мне не нужно беспокоиться о том, что сводная таблица устарела с подчеркивающими таблицами.

Однако перестройка сводной таблицы для каждого значения в расширенных вставках является слишком большим ударом по производительности (иногда я добавляю сотни операторов в программы одновременно).Я хочу, чтобы триггер запускался один раз после выполнения расширенных вставок в подчеркивающих таблицах.Это возможно?

1 Ответ

4 голосов
/ 04 мая 2011

Триггер выполняет свою работу, например, «ДЛЯ КАЖДОГО РЯДА».

Я не верю, что mysql дает вам возможность запустить триггер один раз в конце.

Я бы вызвал хранимую процедуру из вашего кода после успешного завершения INSERT.

Если вы беспокоитесь о том, чтобы забыть, настройте задание cron для запуска его время от времени.

Удачи.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...