能不能只取ROW_NUMBER中的rn = 1,不取其余的rn来提高查询速度?
Is it possible to get only rn = 1 in ROW_NUMBER without getting the rest of the rn to increase query speed?
所以我有一个问题:
(ROW_NUMBER() OVER (PARTITION BY itm.storeID, itm.skuID ORDER BY itm.effectiveDate DESC)) AS rn,
然后我会做的是在 table 中使用 foreach 然后扫描 rn 是否等于 1,如果等于则我将添加一个值,所以基本上我对 rn 是的所有行求和等于 1...
问题是 row_number 的查询很慢(不是 foreach),因为它返回了 400,000 多行。查询是按月进行的,所以我每个分区总共得到 30 rn。那么我只需要rn等于1的行...
有没有办法更快地做到这一点?如果我像这样包装查询:
SELECT * FROM (... rn query) t WHERE t.rn = 1
然后我仍然获取整个 rn 然后它只会过滤,所以我并没有真正使查询更快...
我还尝试将它放在临时 table 中,因为我正在使用 Laravel 但它不起作用,因为我使用不同的 DB_HOST 进行读写...
一种方法可能是在单独的子查询 (Derived Table) 中获取分区的 effectiveDate
的最大值。之后,您可以 JOIN 回到主 table,以获取该特定行。
在这里定义一个合适的复合索引也会有所帮助。
尝试以下操作:
SELECT itm.* FROM itm
JOIN (SELECT store_id, skuID, MAX(effectiveDate) AS maxDate
FROM itm
GROUP BY storeID, skuID) AS dt
ON dt.skuID = itm.skuID
AND dt.storeID = itm.storeID
AND dt.maxDate = itm.effectiveDate
您需要定义一个复合索引:(storeID, skuID, effectiveDate)
以获得最佳性能。
所以我有一个问题:
(ROW_NUMBER() OVER (PARTITION BY itm.storeID, itm.skuID ORDER BY itm.effectiveDate DESC)) AS rn,
然后我会做的是在 table 中使用 foreach 然后扫描 rn 是否等于 1,如果等于则我将添加一个值,所以基本上我对 rn 是的所有行求和等于 1...
问题是 row_number 的查询很慢(不是 foreach),因为它返回了 400,000 多行。查询是按月进行的,所以我每个分区总共得到 30 rn。那么我只需要rn等于1的行...
有没有办法更快地做到这一点?如果我像这样包装查询:
SELECT * FROM (... rn query) t WHERE t.rn = 1
然后我仍然获取整个 rn 然后它只会过滤,所以我并没有真正使查询更快...
我还尝试将它放在临时 table 中,因为我正在使用 Laravel 但它不起作用,因为我使用不同的 DB_HOST 进行读写...
一种方法可能是在单独的子查询 (Derived Table) 中获取分区的 effectiveDate
的最大值。之后,您可以 JOIN 回到主 table,以获取该特定行。
在这里定义一个合适的复合索引也会有所帮助。
尝试以下操作:
SELECT itm.* FROM itm
JOIN (SELECT store_id, skuID, MAX(effectiveDate) AS maxDate
FROM itm
GROUP BY storeID, skuID) AS dt
ON dt.skuID = itm.skuID
AND dt.storeID = itm.storeID
AND dt.maxDate = itm.effectiveDate
您需要定义一个复合索引:(storeID, skuID, effectiveDate)
以获得最佳性能。