Посмотрим, что вы делаете:
- Найти строки с типом боя = 0 и результатом <2 </li>
- Заказ по имени пользователя для группировки
- Вычисление агрегации и сворачивание строк для разных имен пользователей
- Заказ по динамически рассчитанным полям
На шаги 3 и 4 вы не имеете никакого влияния. Шаг 2 в его текущей форме не может извлечь выгоду из каких-либо индексов, поскольку outcome < 2
является условием диапазона, хотя индекс для (тип_боя, исход, имя пользователя) выглядит очень заманчиво.
Предполагая, что outcome
является перечислением 0,1,2,3...
, вы можете изменить условие диапазона на сравнение на равенство и использовать индекс по (тип_боя, исход, имя пользователя):
SELECT username, SUM( outcome ) AS wins, COUNT( * ) - SUM( outcome ) AS losses
FROM tblBattleHistory
WHERE battle_type = 0 AND outcome IN (0, 1)
GROUP BY username
ORDER BY wins DESC , losses ASC , username ASC
LIMIT 0 , 50
Если outcome
не является перечислением, подойдет индекс on (тип_боя, исход). Индекс только для (battle_type) теперь является избыточным, поскольку battle_type
является префиксом в составном индексе.