Время ожидания при объединении двух запросов выберите все запросы?

#mysql #sql

Вопрос:

Я пытаюсь объединить два SQL-запроса вместе, которые выглядят примерно так:

 SELECT *, "table1" as table_name
FROM table_one
INNER JOIN
another_table_one
ON
another_table_one.id = table_one.id
UNION
SELECT *, "table2" as table_name
FROM table_two
INNER JOIN
another_table_two
ON
another_table_two.id = table_two.id 
 

Выполнение двух запросов по отдельности работает нормально и возвращает одни и те же столбцы в одном и том же порядке, но когда я объединю их вместе, время ожидания истечет через 60 секунд. Если кто-нибудь из вас может помочь, я был бы очень благодарен!

База данных, с которой я работаю, — это MySQL, отдельные запросы возвращают 10 столбцов, и я не думаю, что это связано с количеством возвращаемых строк, потому что я пытался ограничить количество строк 10, и время ожидания все равно истекло.

Комментарии:

1. Пожалуйста, поделитесь более подробной информацией. Это проблема MySQL или проблема PostgreSQL? Сколько там рядов? Что план выполнения говорит вам о запросе?

2. попробуйте ОБЪЯСНИТЬ или ПРОАНАЛИЗИРОВАТЬ запрос и увеличьте время выполнения

3. Измените СОЮЗ на UNION ALL .

4. @gannothor, проверьте index , определили ли вы id для table_one amp; another_table_one

5. Не лучшая идея для использования *. Попробуйте идентифицировать поля, которые вам нужны, и извлеките только те поля, которые вам нужны для повышения производительности. Также проверьте, что ваши индексы сделаны в соответствующих полях, и попробуйте профилировать SQL.

Ответ №1:

Воспользуйся UNION ALL . UNION накладные расходы на удаление дубликатов. И это не нужно между двумя наборами результатов (потому что последний столбец отличается) и, по-видимому, не нужно в каждом наборе результатов.

Так:

 SELECT *, 'table1' as table_name
FROM table_one INNER JOIN
     another_table_one
     ON another_table_one.id = table_one.id
UNION ALL
SELECT *, 'table2' as table_name
FROM table_two INNER JOIN
     another_table_two
     ON another_table_two.id = table_two.id 
 

Ответ №2:

ВЫБЕРИТЕ.* , ‘table1’ В КАЧЕСТВЕ tblname ИЗ (ВЫБЕРИТЕ * ИЗ table_one, ЧТОБЫ ПРИСОЕДИНИТЬСЯ К another_table_one НА another_table_one.id = table_one.id) КАК СОЮЗ «а»

ВЫБЕРИТЕ b.* , ‘table2’ В КАЧЕСТВЕ имени tbl ИЗ (

ВЫБЕРИТЕ * ИЗ table_two ВНУТРИ, ПРИСОЕДИНИТЕСЬ К другому параметру _table_two ВКЛ another_table_two.id = table_two.id ) КАК «в»

Комментарии:

1. Пожалуйста, добавьте некоторые пояснения к вашему ответу, чтобы другие могли извлечь из него уроки. Что ты изменил, адн, почему?