что делает запрос? Там как я понимаю сейчас логика такая, что берутся 100К строк, это все дело идет домножается на 20К (ибо LEFT JOIN), затем вы группируете по id картинок (подозреваю что так вы проверяете случаи когда у игрушки нету картинки, ибо в любом случае результат счетчика будет либо 0 либо 1, если только id не уникален)... Логика довольно странная. Вам не кажется что можно намного проще?
Что касается условия `b`.`published` = 1, его можно писать в ON у JOIN, тогда проверка будет работать на меньших выборках и вообще вы будете иметь с меньшим количеством рядов. Но мне что-то подсказывает что у вас логика некорректная.