【问题标题】:Mysql Group by rank() performanceMysql Group by rank() 性能
【发布时间】:2022-06-14 15:51:16
【问题描述】:

我目前正在处理一个查询,但我没有得到速度,所以我在问一个问题。

我想找到的是“按 DataID 计算每个类别中最多的名字”。

Data_Category { id : INT PRIMARY KEY AUTO_INCREMENT, 数据标识符:INT, 名称:varchar2(200), 类别:varchar2(200) }

并且可以重复输入。

select dataId, name, category, count(*) as cnt
, rank() over (partition by dataId, category order by count(*) desc) as "ranking"
from data_category
group by dataId, name, category

在上面的查询中,有排名部分和没有排名部分的速度是有区别的。

如果没有rank,则需要0.0053,如果有,则需要0.5秒。

select *, rank() over (partition by A.dataId, A.category order by cnt desc) as "ranking"
from(
  select dataId, name, category, count(*) as cnt
  from data_category
  group by dataId, name, category
) A

上述查询也产生几乎相同的速度。当它被包装在一个 select 语句中时,由于临时表的创建,它正在减慢。

数据约为 400,000 例。

索引是(dataId, category, name)。

我想通过数据ID提取每个类别中名字数量最多的5个名字,但是我无法弄清楚查询的方向。

我将使用此查询创建“视图”。

即使你不写查询,我也真诚地请求一个简单的提示..!

输出:

dataId category name rank
1 cate1 name1_1 1
1 cate1 name1_2 2
1 cate1 name1_5 3
1 cate1 name1_3 4
1 cate2 name2_1 1
1 cate2 name2_5 2
1 cate2 name2_3 3
2 cate1 name3_1 1
2 cate3 name3_9 1

谢谢。

【问题讨论】:

  • Wont a order by count(*) desc limit 5 就足够了(不需要 rank()),因为你只需要前 5 个。
  • 我需要对每个dataId和category进行排名。
  • 您可能需要检查您的分组,如果需要 - 每个类别中的名称数量按数据 ID,它应该按 dataID、类别、名称分组 - 这意味着类别内的名称和类别内的名称数据ID。
  • 是的,没错。我很难写出那个查询。
  • 请添加表定义和解释的输出。

标签: mysql performance rank


猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-14
相关资源
最近更新 更多