@Kerm

Как оптимизировать хранимую процедуру?

При обновлении интернет магазина, создается временная таблица, после занесения данных в которую, выполняется хранимая процедура:

DELIMITER $$
CREATE DEFINER=`root`@`%` PROCEDURE `sync_fl`()
BEGIN
  DROP TABLE IF EXISTS `sh_prod_im__`;
  ALTER TABLE `sh_prod_im` RENAME TO `sh_prod_im__`;
  ALTER TABLE `sh_prod_im_` RENAME TO `sh_prod_im`;
END$$
DELIMITER ;


Интернет-магазин имеет много посещений в день и видать кто то ловит момент переименования таблицы и возникает ошибка (Table 'sh_prod_im' doesn't exist.), как можно оптимизировать данный процесс чтобы подобных проблем не возникало? Читал что процесс изменения названия таблицы занимает 0.10 sec и это не подходит получается.
  • Вопрос задан
  • 78 просмотров
Решения вопроса 1
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
Транзакции тут не помогут, так как DROP TABLE/ALTER TABLE вызывают немедленный COMMIT.
Остаётся только менять саму процедуту обновления таблицы. Например так:
BEGIN TRANSACTION;
UPDATE `sh_prod_im` SET `updated` = 0;

Затем вставляем/обновляем строки:
INSERT 
  INTO `sh_prod_im` (`article`, ..., `updated`) 
  VALUES (:article, ..., 1) 
  ON DUPLICATE KEY UPDATE ..., `updated` = 1;

И удаляем необновлённые:
DELETE FROM `sh_prod_im` WHERE `updated` = 0;
COMMIT;
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы