У меня был массивный запрос, который использовался для выполнения UNION ALL на множестве таблиц (каждый с тысячами строк), а затем выводит их во временную таблицу перед ее возвратом.Объединить множественные Выборы без союза или союза Все
Старая форма:
SELECT *
FROM (SELECT `a` AS `Human readable A`,
`b` AS `Human readable B`,
`c` AS `Human readable C`,
FROM `table1`
UNION ALL
SELECT
`a` AS `Human readable A`,
`b` AS `Human readable B`,
`c` AS `Human readable C`,
FROM `table2`
UNION ALL
SELECT
`a` AS `Human readable A`,
`b` AS `Human readable B`,
`c` AS `Human readable C`,
FROM `table3`
) AS temp_table
Этот запрос довольно много убил базу данных (запрос занимает где-то от 20 минут до 61 минут), в течение которого времени процессор полностью максимизирован.
я обнаружил, что работает индивидуальный ЗЕЬЕСТ для каждой таблицы потребовалось всего несколько секунд самое, и решили объединить их вместе на уровне приложений, которая опирается на другом физическом сервере, который является дополнительным бонусом (псевдокод ниже).
$result1 = SELECT
`a` AS `Human readable A`,
`b` AS `Human readable B`,
`c` AS `Human readable C`,
FROM `table1`
$result2 = SELECT
`a` AS `Human readable A`,
`b` AS `Human readable B`,
`c` AS `Human readable C`,
FROM `table2`
$result3 = SELECT
`a` AS `Human readable A`,
`b` AS `Human readable B`,
`c` AS `Human readable C`,
FROM `table3`
$result4 = merge($result1, $result2, $result3)
Однако, я чувствую, что это немного небезопасно, так как запрос может обновить данные в промежутке между этими отдельными запросами на выборке. Есть ли способ улучшить мой набор запросов запроса выбора, чтобы он обрабатывался как одна транзакция (без необходимости записи), поэтому все данные будут заблокированы с помощью общей блокировки чтения и возвращены.
Дополнительная информация
Я предсказываю, что первоначальная форма взял гораздо больше, потому что он тратит много процессорного времени повторного создания/сортировки индексов в объединенном таблице, то, что мне не нужно делать (Мне нужно только добавить результаты вместе).
- Всех столов имеет точно такую же структуру
- Пожалуйста, обратите внимание, что около 34 из
a
ASHuman readable A
в таблицу данные были разнесены в разные таблицы, потому что они относятся к разным проектам. - В этом конкретном запросе имеется 20 союзов (21 таблица).
- Использование таблиц InnoDB для данных. Я знаю, что это более интенсивно для процессора, чем MyIsam, но, прочитав о различных недостатках MyIsam, я не хочу переключать механизмы хранения.
- Там нет ИНЕКЕ (данные уже «предварительно сгруппированы» по будучи разделены на таблицы)
Покажите нам (а урезывание версия) запрос – Bohemian
Есть ли у вас какие-либо фильтрации или заказ, перейдя? Если это так, это может быть проблемой, поскольку MySQL должен заказывать итоговые результаты, не имея возможности использовать какие-либо индексы.Если вы просто объединяете все таблицы с помощью 'union all', это должно быть очень быстро, если сортировка или фильтрация не происходит. – GolezTrol
@GolezTrol Я не верю, что у меня есть фильтрация или заказ. Я старался использовать UNION ALL вместо UNION, поскольку я верю в него без ВСЕХ, чтобы он выполнял сортировку/поиск дубликатов. – Programster