Я написал хранимую процедуру в MySQL, чтобы принимать значения, находящиеся в настоящее время в таблице, и "нормализовать" их. Это означает, что для каждого значения, переданного хранимой процедуре, она проверяет, находится ли оно уже в таблице. Если это так, то он сохраняет идентификатор этой строки в переменной. Если значение отсутствует в таблице, оно сохраняет идентификатор вновь вставленного значения. Затем хранимая процедура берет идентификаторы и вставляет их в таблицу, которая эквивалентна исходной денормализованной таблице, но эта таблица полностью нормализована и состоит в основном из внешних ключей.
Моя проблема с этим дизайном заключается в том, что хранимая процедура занимает примерно 10 мс или около того, что слишком долго, когда вы пытаетесь работать с примерно 10 миллионами записей. Я подозреваю, что производительность связана с тем, как я делаю вставки. то есть
INSERT INTO TableA
(first_value)
VALUES
(argument_from_sp) ON DUPLICATE KEY UPDATE id=LAST_INSERT_ID(id);
SET @TableAId = LAST_INSERT_ID();
«НА ОБНОВЛЕНИИ ДУПЛИКАЦИОННОГО КЛЮЧА» — это что-то вроде взлома из-за того, что в дублирующем ключе я не хочу ничего обновлять, а просто возвращаю значение идентификатора строки. Однако, если вы пропустите этот шаг, функция LAST_INSERT_ID() вернет неправильное значение, когда вы попытаетесь запустить оператор "SET ...".
Кто-нибудь знает лучший способ сделать это в MySQL?