Написах съхранена процедура в MySQL, за да взема стойности в момента в таблица и да ги "нормализира". Това означава, че за всяка стойност, предадена на запомнената процедура, тя проверява дали стойността вече е в таблицата. Ако е така, тогава той съхранява идентификатора на този ред в променлива. Ако стойността не е в таблицата, тя съхранява идентификатора на нововъведената стойност. След това съхранената процедура взема идентификаторите и ги вмъква в таблица, която е еквивалентна на оригиналната денормализирана таблица, но тази таблица е напълно нормализирана и се състои главно от външни ключове.
Моят проблем с този дизайн е, че съхранената процедура отнема приблизително 10 ms, за да се върне, което е твърде дълго, когато се опитвате да работите с около 10 милиона записа. Подозрението ми е, че изпълнението е свързано с начина, по който правя вложките. т.е.
INSERT INTO TableA
(first_value)
VALUES
(argument_from_sp) ON DUPLICATE KEY UPDATE id=LAST_INSERT_ID(id);
SET @TableAId = LAST_INSERT_ID();
„НА АКТУАЛИЗАЦИЯ НА ДУБЛИРАН КЛЮЧ“ е малко хак, поради факта, че на дублиран ключ не искам да актуализирам нищо, а по-скоро просто да върна стойността на id на реда. Ако обаче пропуснете тази стъпка, функцията LAST_INSERT_ID() връща грешна стойност, когато се опитвате да изпълните израза "SET ...".
Някой знае ли по-добър начин да направите това в MySQL?