【问题标题】:Select latest child for each parent optimization为每个父优化选择最新的子
【发布时间】:2021-06-18 21:04:51
【问题描述】:

我有 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 毫秒

【问题讨论】:

  • 没有索引?
  • 两个 id 都是唯一的并且自动递增,更新我的问题,谢谢
  • 职位有单独表格的原因是什么?
  • 我有很多职位,每天一个

标签: mysql greatest-n-per-group mariadb-10.5


【解决方案1】:

好的,当我不使用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 毫秒

【讨论】:

    【解决方案2】:

    如果ikp 有的话,最里面的子查询可能会运行得更快

    INDEX(keyword_id, id)
    

    这样,优化器可以更有效地执行MAX()。

    【讨论】:

      猜你喜欢
      • 2012-07-28
      • 1970-01-01
      • 2012-06-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-11
      相关资源
      最近更新 更多