如何优化此mysql操作?

时间:2019-06-28 17:47:33

标签: mysql sql query-optimization

我有这张桌子-'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。我可以做些什么来加快速度?

1 个答案:

答案 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()