С самого начала я бы прекратил использовать запрос MID () как в выражении SELECT, так и в GROUP BY. В зависимости от условий вашего запроса, MySQL не обязательно будет кэшировать это внутри одного выражения во время синтаксического анализа, поэтому, по крайней мере, попробуйте это:
SELECT MID(game,{$len},1) AS move,
COUNT(*) AS games,
SUM(win) AS wins,
SUM(loss) AS losses
FROM games WHERE game LIKE '{$game}%' GROUP BY move;
Не самое большое изменение в мире, но оно должно иметь небольшое значение. Однако, кроме этого, я во-вторых, что единственный реальный способ оптимизировать это, если не изменить способ хранения данных, - это предварительно рассчитать эти значения и увеличить их по окончании игры.