Существует ли более быстрый способ эмулировать полное внешнее объединение двух больших таблиц с 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
Другие вопросы по тегам