Задать вопрос
@SET1

Не могу ускорить запрос MySQL. В чем причина?

Какие индекс поставить? Сейчас есть составной индекс на article, status, type, но запрос занимает 3,5 секунды.

SELECT tbl_publication.id, tbl_publication.name, tbl_publication.content, tbl_publication.create_time, tbl_publication.type, tbl_publication.section_id, tbl_publications_media.media_url FROM tbl_publication LEFT JOIN tbl_publications_media ON tbl_publication.id = tbl_publications_media.publication_id AND tbl_publications_media.media_type = 3 WHERE tbl_publication.article = 0 AND tbl_publication.status = 1 AND tbl_publication.type = 0 AND (tbl_publications_media.media_type IS NULL OR tbl_publications_media.media_type = 3) GROUP BY id ORDER BY id DESC LIMIT 12


в таблице tbl_publications_media всего 1 запись, значит дело в таблице tbl_publication (в ней 250 000 записей)

Результат EXPLAIN:
5f908e8ed9aff375313684.png

CREATE TABLE:
5f908edc661b3567152911.png
  • Вопрос задан
  • 81 просмотр
Подписаться 1 Простой Комментировать
Решения вопроса 1
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
1. Выборку по таблице tbl_publication можно вынести в подзапрос. Тогда её можно сразу ограничить 12 записями и делать JOIN по небольшому набору. Заодно можно избавиться от группировки, тем более, что в строгом SQL она неправильная.
2. Учитывая, что используется LEFT JOIN с условием tbl_publications_media.media_type = 3, условие
(tbl_publications_media.media_type IS NULL OR tbl_publications_media.media_type = 3)
будет истинным всегда, от него можно избавиться.
SELECT `p`.`id`, `p`.`name`, `p`.`content`, `p`.`create_time`,
       `p`.`type`, `p`.`section_id`, `m`.`media_url`
  FROM (
    SELECT `id`, `name`, `content`, `create_time`, `type`, `section_id`
      FROM `tbl_publication`
    WHERE `article` = 0 AND `status` = 1 AND `type` = 0
    ORDER BY `p`.`id` DESC
    LIMIT 12
  ) AS `p`
  LEFT JOIN `tbl_publications_media` AS `m`
    ON `m`.`publication_id` = `p`.`id`
      AND `m`.`media_type` = 3

P.S. Про группировку:
Представьте, что с одной строкой из tbl_publications связались две разные строки из tbl_publications_media. Какая из них должна попасть в группу и почему?
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

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