MySQL, оптимизация запроса

Вопрос закрыт, большое спасибо пользователю @edogs.
  • Вопрос задан
  • 2707 просмотров
Пригласить эксперта
Ответы на вопрос 5
через EXPLAIN смотрели?
Ответ написан
@edogs
1) Переверните джоин, джоиньте к B таблицу A, а не наоборот. В среднем лучше джоинить меньшее к большему, к тому же это позволит без напряга фильтровать по b.published.
2) Храните количество картинок отдельным полем в games, ну и a.small заодно если он так уж нужен (хотя его можно и выбирать в принципе, если правильно это сделать). Это позволит на таких запросах вообще обходится без джоина. Это же стандарт, количество постов хранить в таблице с темами, количество тем в таблице с форумами, соответственно количество картинок в таблице с играми...
Ответ написан
Мне кажется вам стоит считать количество картинок заранее: по триггеру или крону и все у вас будет!
(ну раз вам так важна скорость).

В любом случае, попробуйте заменить group by на вложенный подзапрос по __games_images, так хотя бы группироваться будет 1 таблица.
С индексами все просто:
Для каждого запроса нужно создать комбинированный индекс в таком порядке: сначала условия (ON и WHERE), затем группировка (если есть), затем сортировка.
Ответ написан
Fesor
@Fesor
Full-stack developer (Symfony, Angular)
что делает запрос? Там как я понимаю сейчас логика такая, что берутся 100К строк, это все дело идет домножается на 20К (ибо LEFT JOIN), затем вы группируете по id картинок (подозреваю что так вы проверяете случаи когда у игрушки нету картинки, ибо в любом случае результат счетчика будет либо 0 либо 1, если только id не уникален)... Логика довольно странная. Вам не кажется что можно намного проще?

Что касается условия `b`.`published` = 1, его можно писать в ON у JOIN, тогда проверка будет работать на меньших выборках и вообще вы будете иметь с меньшим количеством рядов. Но мне что-то подсказывает что у вас логика некорректная.
Ответ написан
afiskon
@afiskon
Попробуйте сделать составной b-tree индекс по a.id и a.create
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы