Вот фрагмент твоего запроса
SELECT
`Ob`.`id` AS `id`,
@count_details := (SELECT count(*)
FROM game.Details D
WHERE D.objectId = Ob.id AND D.status = 1)
FROM game.`Object` Ob
WHERE status = 1;
А вот эквивалентный ему (надеюсь, а если чуть напортачил - поправить нетрудно)
SELECT
`Ob`.`id` AS `id`,
D.count_details
FROM game.`Object` Ob
JOIN (SELECT objectId, count(*) AS count_details
FROM game.Details AS gD
WHERE gD.status = 1
GROUP BY gD.objectId) AS D ON D.objectId = `Ob`.`id`
WHERE `Ob`.status = 1;
Выглядит более громоздко, зато прозрачен для планировщика/оптимизатора, и подзапрос в нём выполняется однократно, а не на каждый
чих `Ob`.`id`
.