Выберите последний дочерний элемент для каждой родительской оптимизации

У меня есть 2 таблицы, таблица ключевых слов и таблица позиций ключевых слов

структура ключевых слов

      CREATE TABLE `keywords`
(
    `id`      bigint(20) UNSIGNED                     NOT NULL AUTO_INCREMENT,
    `keyword` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL,
    PRIMARY KEY (`id`)
) ENGINE = InnoDB
  DEFAULT CHARSET = utf8mb4
  COLLATE = utf8mb4_unicode_ci;

структура keyword_positions

      CREATE TABLE `keyword_positions`
(
    `id`         bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT,
    `keyword_id` bigint(20) UNSIGNED NOT NULL,
    `position`   int(11) DEFAULT NULL,
    PRIMARY KEY (`id`)
) ENGINE = InnoDB
  DEFAULT CHARSET = utf8mb4
  COLLATE = utf8mb4_unicode_ci;

Вот как я делаю свой выбор

      SELECT `keywords`.*,
       kp.position AS kp_position
FROM `keywords`
         LEFT JOIN `keyword_positions` AS `kp`
                   ON `kp`.`keyword_id` = `keywords`.`id`
                       AND `kp`.`id` =
                           (SELECT MAX(ikp.id)
                            FROM keyword_positions AS ikp
                            WHERE keywords.id = ikp.keyword_id)

Можно ли еще оптимизировать этот запрос? он работает около 800 мс

2 ответа

Хорошо, я получаю гораздо лучшую производительность, когда не использую MAX, Это мой новый запрос

      SELECT `keywords`.*,
       kp.position AS kp_position
FROM `keywords`
         left join `keyword_positions` as `kp`
                   on `kp`.`keyword_id` = `keywords`.`id`
                       and `kp`.`id` = (SELECT ikp.id
                                        FROM keyword_positions AS ikp
                                        WHERE keywords.id = ikp.keyword_id
                                        ORDER BY ikp.id DESC
                                        LIMIT 1)

работает за 30-60 мс

Самый внутренний подзапрос, вероятно, будет работать намного быстрее, если ikp имел

      INDEX(keyword_id, id)

Благодаря этому оптимизатор может MAX() намного эффективнее.

Другие вопросы по тегам