Вопрос программисту по обновлению информации о товарах.

Jarhead

Постоялец
Регистрация
17 Июн 2011
Сообщения
414
Реакции
159
Если Вы делали самостоятельные скрипты для обновления информации о товарах, Вы могли сталкиваться с необходимостью обновлять данные без проблем на стороне клиента, так чтобы не возникала проблема с блокировкой таблиц/записей при обновлении или их временным удалением, перед вставкой новых данных. Какие методы и решения Вы использовали для оптимизации/ускорения вставки новых данных?
 

Jarhead

Постоялец
Регистрация
17 Июн 2011
Сообщения
414
Реакции
159

А что подразумевается под очень большой скоростью?

Я вот пробовал сначала заносить данные во временную таблицу, а после делать RENAME, который согласно документации должен срабатывать за 0.10sec, а посещений интернет магазина так много, что определенные пользователи хватают проблему table doesn't exist...

Скажите Вы пробовали использовать транзакции в хранимых процедурах?
 

savvato

Кодер
Регистрация
3 Янв 2012
Сообщения
503
Реакции
497
UPDATE чем не устраивает?
 

duke1999

Постоялец
Регистрация
11 Сен 2012
Сообщения
252
Реакции
144
Вряд ли есть совсем "бесшовное" решение.
 

savvato

Кодер
Регистрация
3 Янв 2012
Сообщения
503
Реакции
497
bulk update через temporаry table без lock. И не будет блокировать селект. Добавлять новые, удалять старые - тут больше вопрос к алгоритму скрипта.
 

Jarhead

Постоялец
Регистрация
17 Июн 2011
Сообщения
414
Реакции
159
bulk update через temporаry table без lock. И не будет блокировать селект. Добавлять новые, удалять старые - тут больше вопрос к алгоритму скрипта.

Я еще раз пишу, update медленнее insert в два раза, потому что при update = delete+insert. Создание temporary table, даже если и в памяти, после от туда заливать в основную, и удалять temporart table это все мутарно и тоже не нужные замедления.

Задача, к примеру вот такая:

Цель, есть таблица с большим кол-во товаров, и приходит с импортом большое кол-во товаров. То, что приходит, приходит всегда полностью, не частично, частичное обновление/добавление не предусмотрено. Нужно удалить то что не пришло, пропустить схожие и добавить новые. Как бы Вы это сделали?

Вот мое решение:

У меня есть таблица products, я каждый раз при импорте дропаю и вновь создаю таблицу products_ и далее запускаю хранимую процедуру с транзакцией:


Код:
DELIMITER $$
CREATE DEFINER=`root`@`%` PROCEDURE `sync_fl`()
BEGIN

DECLARE exit handler for sqlexception
  BEGIN
    -- ERROR
  ROLLBACK;
END;

DECLARE exit handler for sqlwarning
BEGIN
    -- WARNING
ROLLBACK;
END;

START TRANSACTION;

  UPDATE `products` SET `updated` = 0;

  INSERT INTO `products` (`prod`,`type`,`pict`)
    SELECT `prod`,`type`,`pict`
    FROM `products_`
    ON DUPLICATE KEY UPDATE `updated` = 1;

  DELETE FROM `products` WHERE `updated` = 0;

COMMIT;
END$$
DELIMITER ;

В данной процедуре, я сначала сбрасываю у всех товаров признак обновления `updated` = 0, у таблицы products значение по умолчанию у этой колонки 1. Далее делаю insert из таблицы с пришедшими данными, в существующей таблице устанавливаю 1 если найдено сходство и добавляю новые товары если те есть. Те, товары которых не было в импорте удаляются. Обновление происходит мгновенно.

Хочу понять, является ли мой пример лучшим решением выхода из ситуации или можно сделать лучше?
 

duke1999

Постоялец
Регистрация
11 Сен 2012
Сообщения
252
Реакции
144
круто, причём здесь престашоп?
 
Сверху