#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. Пожалуйста, добавьте некоторые пояснения к вашему ответу, чтобы другие могли извлечь из него уроки. Что ты изменил, адн, почему?