Очень как-то не понрвилась скорость выполнения процедуры... теблица с допданными очень большая ((
Решил ее оптимизировать вот что получилось:
DROP PROCEDURE IF EXISTS `set_dopvalues_new`;
DELIMITER $$
CREATE PROCEDURE `set_dopvalues_new`(IN rev INT)
BEGIN
DECLARE p_id INT;
DECLARE d_id INT;
DECLARE n INT;
SELECT parent_id,dopfield_id INTO p_id,d_id FROM dop_oldvalues WHERE revision=rev LIMIT 1;
START TRANSACTION;
/*Deleting unactual data BEGIN*/
DELETE FROM dopvalues USING dopvalues
INNER JOIN dop_oldvalues
ON dopvalues.dopfield_id=dop_oldvalues.dopfield_id
WHERE dopvalues.parent_id=p_id AND dop_oldvalues.revision=rev;
/*Deleting unactual data END*/
/*Checking on duplicate fields with 'h' flag BEGIN*/
IF EXISTS (SELECT id FROM dopfields WHERE field_flags LIKE '%h%') THEN
SELECT COUNT(*),dv.dopfield_id INTO n,d_id FROM dopvalues dv
INNER JOIN (
SELECT odv.field_value value,odv.dopfield_id id FROM dop_oldvalues odv
INNER JOIN dopfields df
ON df.id=odv.dopfield_id
WHERE odv.parent_id=p_id AND odv.revision=rev AND
df.field_flags LIKE '%h%' AND odv.field_value<>''
) dv1
ON dv1.value=dv.field_value AND dv1.id=dv.dopfield_id
WHERE dv.field_value<>''
GROUP BY dv.dopfield_id;
END IF;
/*Checking on duplicate fields with 'h' flag END*/
IF( n>0 ) THEN
ROLLBACK;
SELECT 1 AS error, d_id AS descr;
ELSE
INSERT INTO dopvalues (parent_id,dopfield_id,field_value)
SELECT parent_id,dopfield_id,field_value FROM dop_oldvalues WHERE revision=rev;
COMMIT;
SELECT 0 AS error, '' AS descr;
END IF;
END$$
DELIMITER ;
А вот тесты. Первый тест это скорость выполнения, когда вообще нет полей с флагом уникальности (Флаг: h)
mysql> call set_dopvalues_new(516477);call set_dopvalues(516477);
+-------+-------+
| error | descr |
+-------+-------+
| 0 | |
+-------+-------+
1 row in set (0.15 sec)
Query OK, 0 rows affected (0.15 sec)
+-------+-------+
| error | descr |
+-------+-------+
| 0 | |
+-------+-------+
1 row in set (4.81 sec)
Query OK, 0 rows affected, 1 warning (4.81 sec)
И результат с имеющимся полем с флагом уникальности:
mysql> call set_dopvalues_new(521752);call set_dopvalues(521752);
+-------+-------+
| error | descr |
+-------+-------+
| 0 | |
+-------+-------+
1 row in set (0.19 sec)
Query OK, 0 rows affected, 1 warning (0.19 sec)
+-------+-------+
| error | descr |
+-------+-------+
| 0 | |
+-------+-------+
1 row in set (6.13 sec)
Query OK, 0 rows affected, 1 warning (6.13 sec)
Если есть дубликаты, то выполняется так же быстро
Прошу всех на тест
Если надумаете запускать в работу - не забудьте назвать процедурку правильно:
set_dopvalues