2017-01-30 4 views
0

У меня есть система внутренней инвентаризации с нижеуказанными 3 таблицами какОбновление/Вставка Большие записи таблицы на основе другой таблицы ReferenceID.

a. Акции - Ежедневно обновляется из файла CSV.

--------------------------------- 
| id | MODELNO | Discount | MRP | 
--------------------------------- 
| 1 | MODEL_1 | 40%  | 900 | 
| 2 | MODEL_A | 20%  | 600 | 
--------------------------------- 

Каждый день эта таблица данных усеченные и новые акции импортированы из файла CSV торговца. (Около 6 миллионов записей)

б. Полотна Master - база мастера одежды

---------------------------------------- 
| ref_id | MODELNO | Name  | MRP | 
---------------------------------------- 
| 80  | MODEL_1 |Some Dress | 900 | 
| 81  | MODEL_A |Another Dress| 600 | 
---------------------------------------- 

MODELNO является уникальным и ref_id первичным ключом. Эта таблица является частью внутреннего приложения инвентаризации (имеет около 4,5 млн. Записей)

c. Inventory стол - это часть внутренних приложений

------------------------------------------------- 
| id | ref_id | Name  | MRP | status  | 
------------------------------------------------- 
| 1 | 80  |Some Dress | 900 | ACTIVE | 
| 2 | 81  |Another Dress| 600 | INACTIVE | 
-------------------------------------------------- 

В этой таблице хранится ресурсы, доступные для продукта, основанных на акциях и если скидка, если выше 40% продукт ACTIVE еще по умолчанию INACTIVE.

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

То, что я пробовал до сих пор, это PHP-скрипт, который будет. a. Во-первых, установите статус в таблице инвентаризации для всех записей в значение НЕАКТИВНО. b. И для каждой записи в таблице запасов проверьте, существует ли MODELNO в таблице «Ткань». b. Если записи существуют, то получите ref_id и проверьте, соответствует ли ref_id в таблице инвентаризации и обновляет/вставляет запись.

Проблема в том, что для выполнения сценария требуется более 8+ часов.

Можете ли вы предложить эффективный способ, который можно использовать для реализации вышеуказанных функций.

Примечание: Все вставки и обновленные таблицы инвентаризации выполняются с использованием функции вставки/обновления пакета CodeIgniter. Я установил все статус НЕАКТИВНО, так как может быть несколько продуктов, которых нет в БД запаса.

+0

Подсказка: Не хранить «%». – Strawberry

+0

Сделаю это, кстати, я использовал Mysql Load Inline, чтобы выгрузить файл CSV в DB. Также добавили индекс для MODELNO, а поле ref_id – epynic

ответ

0

Вопрос в этом случае, который возникает в виду, - почему бы не использовать триггер?

Создать таблицу so_stocks

CREATE TABLE IF NOT EXISTS `so_stocks` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `MODELNO` varchar(50) COLLATE uft8_general_ci NOT NULL DEFAULT '0', 
    `Discount` int(10) DEFAULT '0', 
    `MRP` int(11) DEFAULT '0', 
    PRIMARY KEY (`id`) 
) ENGINE=MyISAM AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 COLLATE=uft8_general_ci; 

INSERT INTO `so_stocks` (`id`, `MODELNO`, `Discount`, `MRP`) VALUES 
    (1, 'MODEL_1', 40, 900), 
    (2, 'MODEL_A', 20, 600); 

создать таблицу so_inventory

CREATE TABLE `so_inventory` (
    `id` INT(11) NOT NULL AUTO_INCREMENT, 
    `ref_id` INT(11) NOT NULL DEFAULT '0', 
    `Name` VARCHAR(255) NOT NULL DEFAULT '0' COLLATE 'uft8_general_ci', 
    `MRP` INT(11) NOT NULL DEFAULT '0', 
    `status` TINYINT(1) NOT NULL DEFAULT '0', 
    PRIMARY KEY (`id`) 
) 
COLLATE='uft8_general_ci' 
ENGINE=MyISAM 
AUTO_INCREMENT=1 
; 

И, наконец, за столом so_cloths

CREATE TABLE `so_cloths` (
    `ref_id` INT(11) NOT NULL AUTO_INCREMENT, 
    `MODELNO` VARCHAR(50) NOT NULL DEFAULT '0' COLLATE 'uft8_general_ci', 
    `Name` VARCHAR(255) NOT NULL DEFAULT '0' COLLATE 'uft8_general_ci', 
    `MRP` INT(11) NOT NULL DEFAULT '0', 
    PRIMARY KEY (`ref_id`) 
) 
COLLATE='uft8_general_ci' 
ENGINE=MyISAM 
AUTO_INCREMENT=1 
; 

А теперь триггер

CREATE DEFINER=`root`@`::1` TRIGGER `so_cloths_after_insert` AFTER INSERT ON `so_cloths` FOR EACH ROW BEGIN 
    INSERT INTO so_inventory (ref_id,Name,MRP,status) 
    select sc.ref_id,sc.Name, sc.MRP, if (ss.Discount >= 40, 1,0) AS active from so_cloths AS sc 
    LEFT JOIN so_stocks AS ss ON (sc.MODELNO = ss.MODELNO) 
    WHERE sc.ref_id = new.ref_id; 
END 

Каждый раз, когда вы вставляете что-то в so_cloths, вставка будет сделана в so_inventory.

Очевидно, что это зависит от того, хотите ли вы вставлять данные после вставки их в so_stocks или в so_cloths - вы должны это решить, но пример должен дать вам некоторое представление.

Определитель в операторе триггера должен быть изменен в настройках

+0

Спасибо, дадим попытку и вернемся, между тем, не приведет к замедлению вставки? – epynic

+0

конечно - но они определенно быстрее, чем запрос php – sintakonte

Смежные вопросы