У меня есть две таблицы, каждая из которых содержит по шесть строк. Я пытаюсь присоединиться к двум, используя внутреннее соединение, но запрос выполнялся в течение 2 дней без завершения. Присоединиться в (обратите внимание, я использовал count(*)
просто, чтобы я мог запустить объяснить, я на самом деле с помощью join
в CTAS):MySQL Query с внутренним соединением очень медленным
SELECT count(*)
FROM table1 t1,
table2 t2
WHERE t1.col1 = t2.colA
AND t1.col2 = t2.colB;
После небольшого исследования я нашел ниже запрос прекрасно работает:
SELECT count(*)
FROM
(SELECT *
FROM table1) t1,
(SELECT *
FROM table2) t2
WHERE t1.col1 = t2.colA
AND t1.col2 = t2.colB;
Единственное различие между тем, что вместо таблицы, я использую подзапрос SELECT * FROM table
;
Запуск планов объяснений показывает, что последний запрос создает индекс, когда он выбирает таблицу2. В то время как первый запрос использует буфер соединения (Block Nested Loop).
Несомненно, MySQL достаточно умен, чтобы решить, что два запроса практически идентичны и делают то же самое с обоими запросами? Я не понимаю, почему индекс нужен, потому что в любом случае требуется полное сканирование для обеих таблиц. Это временные/временные таблицы, поэтому, если бы я включил индекс, это было бы буквально просто для этого объединения.
Есть ли способ исправить это через конфигурацию MySQL?
Можете ли вы опубликовать объяснения для обоих вариантов? Какая версия вашего mysql? – Shadow