MYSQL: параллельное выполнение нескольких операторов в хранимой процедуре? - PullRequest
0 голосов
/ 08 июня 2011

У меня есть процедура (procedureA), которая перебирает таблицу и вызывает другую процедуру (procedureB) с переменными, полученными из этой таблицы.

Каждый вызов procedureB не зависит от последнего вызова.

Когда я запускаю procedureA, мои системные ресурсы показывают максимальную загрузку ЦП 50% (я предполагаю, что это 1 из 2 моих ядер ЦП).

Однако, если я открою два экземпляра терминала mysql и выполню запрос на обоих терминалах, будут использованы оба ядра ЦП (загрузка ЦП может достигать почти 100%).

Как можно добиться того же эффекта внутри хранимой процедуры?

Я хочу сделать что-то вроде этого:

BEGIN
    CALL procedureB(var1); -> CPU CORE #1
    SET var1 = var1+1;
    CALL procedureB(var1); -> CPU CORE #2
END

Я знаю, что это не будет так просто ... Какие-нибудь советы?

Ответы [ 2 ]

2 голосов
/ 08 июня 2011

В MySQL, чтобы выполнить что-то асинхронно, вы должны использовать CREATE EVENT, но я не уверен, разрешено ли его создание в хранимой процедуре.(С другой стороны: асинхронные вставки могут, конечно, выполняться с INSERT DELAYED, но это 1 поток, точка).

Обычно вам гораздо лучше иметь пару процессов / рабочих / демонов, которыеможет быть асинхронно доступен вашей программе и иметь собственное соединение с базой данных, но это, конечно, не будет в той же процедуре.

1 голос
/ 03 июля 2012

Вы можете написать свой собственный демон в качестве хранимой процедуры и запланировать запуск нескольких копий через равные промежутки времени, скажем, каждые 5 минут, 1 минуту, 1 секунду и т. Д.

используйте get_lock () сN четко определенных имен блокировок, чтобы прервать выполнение события, если еще одна копия события все еще выполняется, если вы хотите, чтобы одновременно выполнялось не более N параллельных копий.

Используйте «таблицу заданий» для вывода списка заданийвыполнить со столбцом идентификатора для определения порядка выполнения.Конечно, обязательно используйте хорошие методы транзакций и блокировок - это, в конце концов, повторное программирование.

Каждая строка может определять хранимую процедуру для выполнения и, возможно, параметры.Вы даже можете иметь несколько типов заданий, таблиц заданий и рабочих событий для разных задач.

Используйте PREPARE и EXECUTE с оператором CALL для динамического вызова хранимых процедур, имена которых хранятся в строках.

Затем просто добавьте строки по мере необходимости в таблицу заданий, даже вставляя их большими партиями, и пусть ваши рабочие события обрабатывают их так быстро, как только могут.

Я делал это раньше, как в Oracle, так и в MySQL, и это хорошо работает.Обязательно обрабатывайте ошибки и регистрируйте их где-нибудь, а также об успехе, в этом отношении, для отладки и аудита, а также для настройки производительности.N = # Процессоры могут не подходить лучше всего, в зависимости от ваших данных и типов заданий.Я видел, что N = 2xCPU лучше всего подходят для задач с интенсивным использованием данных, где большое количество параллельных дисковых операций ввода-вывода важнее вычислительных мощностей.

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