У меня есть база данных со строками, как следующее:Плохо UNION ALL производительность в MySQL
+------------+---------+------------+-------+
| continent | country | city | value |
+------------+---------+------------+-------+
| Asia | China | Beijing | 3 |
| ... | ... | ... | ... |
| N. America | USA | D.C | 7 |
| .... | .... | .... | .... |
Для того, чтобы произвести визуализацию TreeMap, мне нужно работать это в таблицу со следующей формой:
+-----+------------+-------+
| uid | parent-uid | value |
+-----+------------+-------+
В этом случае Asia
является «родительским» для China
, который является «родительским» для Beijing
. Так что для этих трех вы бы что-то вроде:
+---------+--------+-----+
| Beijing | China | 3 |
| China | Asia | ... |
| Asia | global | ... |
+---------+--------+-----+
«ценность» для China
должна быть совокупность всех значений ребенка. Аналогично, значение Asia
должно быть совокупностью всех дочерних значений.
Для этого чисто в SQL я создал следующие три запроса и совместили их с UNION ALL
:
# City-level:
SELECT
CONCAT(continent, "-", country, "-", city) as uid,
CONCAT(continent, "-", country) as parentuid,
value
FROM
table
UNION ALL
# Country-level
SELECT
CONCAT(continent, "-", country) as uid,
continent as parentuid,
SUM(value) as value
FROM
table
GROUP BY
country
UNION ALL
# Continent-level
SELECT
continent as uid,
"global" as parentuid,
SUM(value) as value
FROM
table
GROUP BY
continent
Каждый из индивидуальных запросов завершается в миллисекундах. Результаты всех возвратов на уровне города, уровня страны и континента на уровне < 0,01 секунд
Когда я объединяю их всех вместе, для получения результатов требуется 8 секунд!
Я попытался погуглить вопросы, но все просто говорит: «Использование UNION ALL
вместо UNION
» (я уже)
Я считал, что она не может иметь достаточно оперативной памяти для создания таблицы временных результатов, так что это диск громя , но я не знаю, как увеличить предел памяти. Я попытался натыкаясь innodb_buffer_pool_size
до 1 ГБ (1073741824), но это не помогло
Вы уверены, что это запрос, который замедляет работу, а не прохождение или рендеринг результирующего набора? –
Сколько строк в таблице? Сколько строк на выходе? –
Сколько у вас RAM? Какую версию mysql вы используете? (Может возникнуть проблема с неявной таблицей temp, участвующей здесь.) –