Я написал хранимую процедуру в MySQL, чтобы принимать значения в настоящее время в таблице и «Нормализовать» их. Это означает, что для каждого значения, переданного хранимой процедуре, он проверяет, уже ли это значение в таблице. Если это так, то он сохраняет идентификатор этой строки в переменной. Если значение отсутствует в таблице, оно сохраняет идентификатор вновь вставленного значения. Хранимая процедура затем принимает идентификаторы и вставляет их в таблицу, которая эквивалентна исходной таблице с отменой нормализации, но эта таблица полностью нормализована и состоит из преимущественно внешних ключей.Производительность хранимых процедур 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();
«ON KEY UPDATE DUPLICATE» немного рубить, из-за того, что на дубликат ключа я не хочу, чтобы обновить что-нибудь, а просто возвращает значение идентификатора строки. Если вы пропустите этот шаг, функция LAST_INSERT_ID() вернет неправильное значение, когда вы пытаетесь запустить инструкцию «SET ...».
Кто-нибудь знает, как лучше это сделать в MySQL?
Идентификатор в противном случае был бы полем VARCHAR. Из-за соображений производительности я предпочел бы целое поле. – srkiNZ84
Уникальный идентификатор по-прежнему является полем varchar; все, что вы сделали, это добавить еще один столбец и другой уникальный индекс в таблицу. Целочисленный уникальный идентификатор не имеет никакой цели, и самое лучшее, что можно сказать о нем, это то, что он не сильно замедлит работу. Признание всех частей приложения было хорошей идеей и позволит вам сосредоточиться на вещах, которые имеют значение. –