如何使 DISTINCT 和 FIRST_VALUE 执行得更快?

问题描述 投票:0回答:1

我有以下疑问:

SELECT DISTINCT FIRST_VALUE(business_id)
       OVER (PARTITION BY b.sub_category_id
             ORDER BY AVG(stars) desc, COUNT(*) DESC) business_id,
       sub_category_id
FROM purchase_experience pe
JOIN businesses b ON b.id = pe.business_id
 AND b.status = 'active'
 AND b.sub_category_id IN (1010 ,1007 ,1034 ,1036)
WHERE pe.stars <> 0
GROUP BY business_id
LIMIT 4

它返回类似这样的内容:

business_id | sub_category_id
1744        | 1007
13215       | 1010
9231        | 1034
9103        | 1036

这是

EXPLAIN
的结果:

可悲的是,执行大约需要7秒。知道如何优化它吗?

sql mysql performance query-optimization greatest-n-per-group
1个回答
0
投票

删除

DISTINCT
,它似乎正在尝试做与
FIRST_VALUE
相同的事情。

查询似乎是一个“groupwise_max”问题。请参阅我添加的标签以获得更好的方法。或者看这里:Groupwise-Max

首先编写查询来查找整个表的统计信息,然后弄清楚如何应用groupwise-max。

还有,

LIMIT 4
,你想要哪4个?您需要
ORDER BY
来指定此类。

© www.soinside.com 2019 - 2024. All rights reserved.