2016-08-19 2 views
0

У меня большая проблема с моим запросом к базе данных.SQL QUERY - UNION - несколько одинаковых таблиц занимают много времени

Я объяснил свою проблему, у меня есть 11 одинаковых таблиц (резервных копий). Таблицы точно такие же, и мне нужно извлечь данные из них, но это занимает очень много времени.

Я использую накидной запрос, как это:

select id, name, ... from table_1 WHERE (...) 
UNION 
select id, name, ... from table_3 WHERE (...) 
UNION 
select id, name, ... from table_2 WHERE (...) 
... ORDER BY created DESC LIMIT 0,50 

Но только запрос занимает около 16 секунд! База данных не имеет, что много данных, что она так долго ...

table_1 = 1.3k 
table_2 = 17k 
table_3 = 10k 
table_4 = 10k 
...  = 10k 
table_11= 140K 

Можете ли вы мне помочь оптимизировать этот запрос? Большое спасибо!

+0

Проблема, вероятно, в конце полного результата. Сколько данных вы вернетесь? –

+0

Избегайте использования какого-либо внутреннего запроса, если вы используете. вместо этого используйте Join. – dhS

ответ

4

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

select id, name, ... from table_1 WHERE (...) 
UNION ALL 
select id, name, ... from table_3 WHERE (...) 
UNION ALL 
select id, name, ... from table_2 WHERE (...) 
... 
ORDER BY created DESC 
LIMIT 0, 50; 

Вы также можете иметь возможность повысить производительность за счет использования индексов, подходящие для пункта WHERE. Однако на ваш вопрос недостаточно информации.

На самом деле, еще одна оптимизации принимать первые 50 строк из каждого подзапроса перед тем объединения:

(select id, name, ... from table_1 WHERE (...) ORDER BY created DESC LIMIT 50) 
UNION ALL 
(select id, name, ... from table_3 WHERE (...) ORDER BY created DESC LIMIT 50) 
UNION ALL 
(select id, name, ... from table_2 WHERE (...) ORDER BY created DESC LIMIT 50) 
... 
ORDER BY created DESC 
LIMIT 0, 50; 

Это уменьшает объем данных для окончательного ORDER BY, который должен также ускорить процесс.

+0

Большое спасибо, он работает. - 0.0205s от 16 секунд –

+0

Вы все еще здесь? Я не могу использовать ограничения во всех запросах. Я использую paginator, и мне нужны все соответствующие данные. Не только 50 из каждой таблицы и снова у меня есть 11сек для заполнения запроса –

+0

@ СергейПетров. , , Запросы в вашем вопросе показывают только один предел. Второе решение не работает для разбивки на страницы. Но на самом деле, если это то, что вы хотите сделать, вы должны поместить все данные в одну таблицу. Это упростит запрос и упростит его оптимизацию. –

0

UNION пытается разобрать все отдельные запросы из каждой таблицы, которые она вернула. Если вы точно знаете, что дубликатов нет, тогда вместо этого вы можете использовать UNION ALL.

Если вы беспокоитесь о дубликатах, используйте UNION ALL, чтобы выбрать все во временную таблицу или подзапрос, а затем GROUP BY каждый столбец, который вы возвращаете, чтобы устранить их.

Для получения реальных указаний загляните в панель инструментов для оценочного плана Execultion. Нажмите эту кнопку, и он покажет вам, какая часть запроса занимает много времени, и предложит улучшения.

Смежные вопросы