我有这张桌子-'product-usage'。该表中的列是id,rank,product_id,checked_at(时间戳)。我正在尝试向此表添加另一列(时间戳),称为“ last_inactive”,并追溯填充该列。这样做的逻辑是 1)找到created_at作为相同product_id的下一个直接条目(按排名排序) 2)以该时间戳记减去1秒,然后使用该时间戳记填充当前列并继续 3)如果下一行不存在,请使用now()作为last_inactive的值
我已经尝试了以下方法以获得想要的结果
function Test-Boolean {
param(
[Nullable[Boolean]] $Test
)
if ( $Test -ne $null ) {
if ( $Test ) {
"You specified -Test `$true"
}
else {
"You specified -Test `$false"
}
}
else {
"You did not specify -Test"
}
}
此查询适用于此特定product_id,但每个product_id大约需要2-3秒,并且我希望此功能可用于大约20k个不同的product_id。我可以做些什么来加快速度?
答案 0 :(得分:0)
您不需要在子查询中进行聚合。所以试试这个:
SELECT pu.*,
coalesce(date_sub( (SELECT pu2.checked_at
FROM product_usage pu2
WHERE pu2.rank > pu.rank AND
pu2.product_id = pu.product_id
ORDER BY pu2.rank ASC
LIMIT 1 OFFSET 0
), INTERVAL 1 second
), now() ) as valid_until
FROM product_usage pu
WHERE pu.product_id = 1111111; -- looks like a number so removed the single quotes
然后为此,您希望在product_usage(product_id, rank, created_at)
上建立索引。
当然,在MySQL 8+中,您只需使用lead()
。