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

Тема в разделе "PrestaShop", создана пользователем Jarhead, 14 ноя 2018.

Информация :
Приветствую гость, обрати внимание! Темы которые закреплены в разделах, в скором времени будут откреплены. Правила раздела PrestaShop

(Не актуальные темы) Каталоги:Модули PrestaShop 1.7Модули PrestaShop 1.5 - 1.6Шаблоны PrestaShop 1.7Шаблоны PrestaShop 1.5 - 1.6
(Не актуальные темы) Поиск / Запросы:Модули PrestaShop 1.7Модули PrestaShop 1.5 - 1.6Шаблоны PrestaShop 1.7Шаблоны PrestaShop 1.5 - 1.6
Полезная информация:Поддержка и помощь c PrestaShopУбираем ПрестаТраст, стучалки и прочую рекламуСовместные покупки модулей и шаблоновПеревод Prestashop и модулей
Модераторы: trace
  1. Jarhead

    Jarhead

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

    duke1999

    Регистр.:
    11 сен 2012
    Сообщения:
    243
    Симпатии:
    137
    LOAD DATA INFILE
     
  3. Jarhead

    Jarhead

    Регистр.:
    17 июн 2011
    Сообщения:
    406
    Симпатии:
    153
    А что подразумевается под очень большой скоростью?

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

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

    savvato Кодер

    Регистр.:
    3 янв 2012
    Сообщения:
    491
    Симпатии:
    457
  5. Jarhead

    Jarhead

    Регистр.:
    17 июн 2011
    Сообщения:
    406
    Симпатии:
    153
    Update медленнее, может блокировать селект, и необходимо не только изменять, а еще и добавлять новые или удалять старые записи.
     
  6. duke1999

    duke1999

    Регистр.:
    11 сен 2012
    Сообщения:
    243
    Симпатии:
    137
    Вряд ли есть совсем "бесшовное" решение.
     
  7. savvato

    savvato Кодер

    Регистр.:
    3 янв 2012
    Сообщения:
    491
    Симпатии:
    457
    bulk update через temporаry table без lock. И не будет блокировать селект. Добавлять новые, удалять старые - тут больше вопрос к алгоритму скрипта.
     
  8. Jarhead

    Jarhead

    Регистр.:
    17 июн 2011
    Сообщения:
    406
    Симпатии:
    153
    Транзакции
     
  9. Jarhead

    Jarhead

    Регистр.:
    17 июн 2011
    Сообщения:
    406
    Симпатии:
    153
    Я еще раз пишу, 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 если найдено сходство и добавляю новые товары если те есть. Те, товары которых не было в импорте удаляются. Обновление происходит мгновенно.

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

    duke1999

    Регистр.:
    11 сен 2012
    Сообщения:
    243
    Симпатии:
    137
    круто, причём здесь престашоп?