#mysql #sql
#mysql #sql
Вопрос:
У меня странная проблема, которую я не могу понять. Я не большой специалист по MySQL (скорее специалист по SQL Server), и у меня есть оператор INSERT, который выполняется (по-видимому) вечно.
INSERT INTO voter_registration_v2.temp_address_map (person_id, address_id)
select person_id, address_id from
voter_registration.voters v
inner join voter_registration_v2.address a
on v.house_num = a.house_num
and v.half_code = a.half_code
and v.street_dir = a.street_dir
and v.street_name = a.street_name
and v.street_type_cd = a.street_type_cd
and v.street_sufx_cd = a.street_sufx_cd
and v.unit_designator = a.unit_designator
and v.unit_num = a.unit_num
and v.res_city_desc = a.res_city_desc
and v.state_cd = a.state_cd
and v.zip_code = a.zip_code;
Сам ВЫБОР выполняется за 20 секунд, 16 секунд для выборки. Когда я запускаю INSERT, у меня истекло время ожидания на 6000 секунд. Все таблицы используют движок MyISAM. Изначально я пытался использовать InnoDB, но это ничего не изменило. Это определенно большая вставка — около 600 тыс. записей. Ниже приведено СОЗДАНИЕ для временной таблицы.
CREATE TABLE temp_address_map (
person_id int PRIMARY KEY,
address_id INT
);
Однако, даже с 600k — я не могу представить, чтобы ВСТАВКА занимала более 100 минут, если ВЫБОР занимает всего ~ 30 секунд. Ценю любые предложения.
В любом случае я заметил странные проблемы с моей локальной установкой MySQL. Некоторые операторы SELECT, которые занимают .5 секунд или менее случайным образом, также начали выполняться вечно. ЕДИНСТВЕННЫЙ способ, которым я мог решить проблему, — это удалить и переустановить сервер. Я, должно быть, просмотрел 100 предложений на форумах, прежде чем сдался. Похоже, что MySQL становится все медленнее, пока не станет непригодным для использования. (моя оперативная память используется примерно на 48%). Как-то странно, не уверен, что это то, что здесь происходит…
Ответ №1:
Вы правы. В большинстве случаев select
запрос, который возвращается через 20 секунд, не должен занимать часы для insert
. Однако я бы предупредил, что вы можете выбирать время на select
основе возвращаемой «первой строки». insert
Не возвращается, пока не будут возвращены все строки.
У вас есть очень подробное on
предложение. Я бы предложил составной индекс для всех столбцов, используемых в предложении (начиная с самого общего и заканчивая наименее общим):
create index idx_address_allkeys
on address(state_cd, res_city_desc, zip, street_name, . . . );
Другими словами, я предполагаю, что ваш код использует соединение с вложенным циклом, возвращая по одной строке за раз.
Комментарии:
1. ОТЛИЧНО!, снизился до 16 секунд при вставке. Спасибо.
2. @kaledev . . . Круто. Улучшение по крайней мере на 99,7%.