Существует ли более быстрый способ эмулировать полное внешнее объединение двух больших таблиц с 40 миллионами строк с использованием mySQL
Я новичок в MySQL. Я пытаюсь эмулировать полное внешнее соединение, используя mySQL. У меня есть две таблицы, каждая имеет следующий формат: таблица:
id1 | id2 | id3 | id4 | id5 | значение
--a- | --b-- | --c-- | -d-- | --e --- | 1
--g- | --h-- | --i-- | --j-- | --k-- | 1
--w- | --x- | --y-- | -z --- | --- --e | 1
Первые пять столбцов являются ключами, то есть ни у одной строки нет одинакового списка ключей. Я использую следующий скрипт MySQL.
SELECT t1.id1, t1.id2, t1.id3, t1.id4, t1.id5, t1.value, t2.value
FROM table1 t1
LEFT JOIN table2 t2
ON t1.id1=t2.id1
AND t1.id2=t2.id2
AND t1.id3=t2.id3
AND t1.id4=t2.id4
AND t1.id5=t2.id5
UNION
SELECT t2.id1, t2.id2, t2.id3, t2.id4, t2.id5, t1.value, t2.value
FROM table1 t1
RIGHT JOIN table2 t2
ON t1.id1=t2.id1
AND t1.id2=t2.id2
AND t1.id3=t2.id3
AND t1.id4=t2.id4
AND t1.id5=t2.id5 ;
Этот запрос занимает много времени, я также увеличил время ожидания соединения до 6000 секунд. До сих пор я не смог получить вывод запроса из-за большого времени выполнения.
Есть ли более быстрый способ сделать это, и как я могу оценить количество времени, необходимое для выполнения запроса?
2 ответа
Я недавно придумал ту же проблему, проверьте этот связанный вопрос, который предлагает решение, которое хорошо сработало для меня
Попробуйте написать с Union все вместо Union . Потому что Union тянет, что занимает много времени. и использовать подзапрос, чтобы различать.
select distinct t1.id1,*
(SELECT t1.id1, t1.id2, t1.id3, t1.id4, t1.id5, t1.value, t2.value
FROM table1 t1
LEFT JOIN table2 t2
ON t1.id1=t2.id1
AND t1.id2=t2.id2
AND t1.id3=t2.id3
AND t1.id4=t2.id4
AND t1.id5=t2.id5
UNION all
SELECT t2.id1, t2.id2, t2.id3, t2.id4, t2.id5, t1.value, t2.value
FROM table1 t1
RIGHT JOIN table2 t2
ON t1.id1=t2.id1
AND t1.id2=t2.id2
AND t1.id3=t2.id3
AND t1.id4=t2.id4
AND t1.id5=t2.id5 )A