问题描述
关键字结构
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 毫秒
解决方法
好的,当我不使用 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 毫秒
,如果有 xx <- c(3L,2L,1L,4L,3L,1L)
#Initialise output vector
yy <- integer(length(xx))
#Assign the 1st group
yy[1:xx[1]] <- 1
#Set the current position
i <- xx[1] + 1
#Initialise the group number
group <- 2
#While all the groups have been assigned
while(any(yy == 0)) {
#Assign the next group number
yy[i:(i+xx[i] - 1)] <- group
#Increment the group number
group <- group + 1
#Increment the current position.
i <- i+xx[i]
}
yy
#[1] 1 1 1 2 2 2 2 3 4 4 5 5 6 6 6 6
,最里面的子查询可能会运行得更快
ikp
这样,优化器可以更高效地执行 INDEX(keyword_id,id)
。