#mysql
#mysql
Вопрос:
Я пытаюсь обновить таблицу (~ 2 миллиона строк) на основе другой таблицы (10 тыс. строк). Однако мой запрос на обновление занимает очень много времени (30 минут) без каких-либо результатов на данный момент. Есть ли способ оптимизировать этот запрос?
UPDATE global_mobility_report
SET
global_mobility_report.locationID1 = (SELECT
geography.locationID
FROM
geography
WHERE
global_mobility_report.country_region = geography.country_region
AND global_mobility_report.sub_region_1 = geography.sub_region_1
AND global_mobility_report.sub_region_2 = geography.sub_region_2
AND global_mobility_report.metro_area = geography.metro_area
AND global_mobility_report.iso_3166_2_code = geography.iso_3166_2_code
AND global_mobility_report.census_fips_code = geography.census_fips_code);
Комментарии:
1. @Akina извините, могу я попросить более подробной информации? я не вижу, где я допустил ошибку
2. Используйте оператор ОБНОВЛЕНИЯ -> Синтаксис с несколькими таблицами
3. Я пытаюсь обновить таблицу (~ 2 миллиона строк) на основе другой таблицы (10 тыс. строк). Этот запрос должен иметь значение
global_mobility_report.locationID1
NULL для всех строк, в которых нет совпадающей строкиgeography
. без каких-либо выходных данных что вы хотите получить от запроса на ОБНОВЛЕНИЕ? это не SELECT …
Ответ №1:
UPDATE global_mobility_report
JOIN geography USING ( country_region,
sub_region_1,
sub_region_2,
metro_area,
iso_3166_2_code,
census_fips_code )
SET global_mobility_report.locationID1 = geography.locationID;
Наличие соответствующего индекса улучшится.
Строки, в global_mobility_report
которых нет соответствующей строки, geography
не будут обновлены (останутся неизменными). Если вам нужно, чтобы они были установлены в NULL, тогда используйте ЛЕВОЕ СОЕДИНЕНИЕ.
Комментарии:
1. Я проверю этот запрос и посмотрю время обработки. Спасибо.
2. могу я спросить, займет ли этот запрос несколько часов или больше? Я работаю уже около часа или около того, и вывода по-прежнему нет…
3. @CheeJiaYuan Без подходящего индекса этот запрос может быть слишком длинным — это правда. Но когда индекс присутствует — он должен быть быстрым (для таблиц 2kk и 10k — несколько минут). Лучший способ — индекс по всему объединяющему выражению (с любым порядком столбцов).
Ответ №2:
Я просто проиндексировал столбцы country_region, sub_region_1, sub_region_2, metro_area, iso_3166_2_code, census_fips_code, и это сработало как шарм!