Индексация поможет, плюс вы можете слегка переписать запрос:
SELECT
s.*, s.total_1 + s.total_2 AS total
FROM (
SELECT
name
, SUM(amount_1) as total_1
, SUM(amount_2) as total_2
FROM table_name
WHERE cond_1 in ('a', 'b')
GROUP BY name ) s
ORDER BY total DESC
LIMIT 10;
Это предотвратит сумму (total_1 + total_2) по всем строкам, но вместо этого повторно использует итоговые значения, рассчитанные в total_1
и total_2
.
Вы также можете попробовать этот вариант, который может быть медленнее или быстрее: -).
Если у вас есть индекс на сумму 1 и количество 2, а существенная, но не огромная доля равна 0, это может быть намного быстрее.
SELECT
s.*, s.total_1 + s.total_2 AS total
FROM (
SELECT
name
, SUM(amount_1) as total_1
, SUM(amount_2) as total_2
FROM table_name
WHERE cond_1 in ('a', 'b') AND (amount_1 <> 0 AND amount_2 <> 0)
GROUP BY name ) s
ORDER BY total DESC
LIMIT 10;
Если у вас есть много вещей в IN
, возможно, это будет быстрее
WHERE cond_1 BETWEEN 'a' AND 'z'
Это обменивает 26 тестов ИЛИ на 2 И тесты.