L'indexation vous aidera, et vous pourrez réécrire légèrement la requête :
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;
Cela évitera de faire la somme de (total_1 + total_2) sur toutes les lignes, mais réutilisera les totaux calculés dans la rubrique total_1
y total_2
.
Vous pouvez également essayer cette variante, qui peut être plus lente ou plus rapide :-).
Si vous avez un index sur amount1 et amount2 et qu'une fraction substantielle, mais pas énorme, est 0, cela peut être beaucoup plus rapide.
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;
Si vous avez beaucoup de choses dans le IN
il peut être plus rapide de faire
WHERE cond_1 BETWEEN 'a' AND 'z'
Cela permet d'échanger 26 tests OR contre 2 tests AND.