对超过百万行进行排序的分组

Posted

技术标签:

【中文标题】对超过百万行进行排序的分组【英文标题】:Group by with sort on more than million rows 【发布时间】:2020-05-02 21:41:39 【问题描述】:

我有一个超过百万行的表。他们每个人都有一个许可证号。

我现在的查询,根据许可证号进行分组,并按计数(不同(类型))和计数(许可证号)和日期排序。

所有带有连接的字段 - license_no 或 date 都被索引。 但是我需要 5 秒才能返回结果。

如何加快性能。理想情况下,结果不应超过一秒钟。 查询:

SELECT `license_no`, 
COUNT(DISTINCT(type)) AS gdid, 
COUNT(id) AS cdid,
max(updated_on) as maxdate
FROM `mytable` 
WHERE `license_no` >0 
GROUP BY `license_no`
ORDER BY `gdid` DESC, `cdid` DESC, maxdate DESC LIMIT 12

我要实现的逻辑:

我有一个汽车清单(百万+记录)。

我想找到所有独特的汽车(由 license_no 唯一) 排序方式:

license_no 具有最大数量的不同类型 license_no 具有最大总计数 最后按最新日期对单个记录进行排序。

【问题讨论】:

请说明您要实现的逻辑。您的查询格式错误,因为您在ORDER BY 中引用了updated_on,但它没有在SELECT 中定义,也不是GROUP BY 列。 @GordonLinoff,我已经更新了查询和我想要获取的数据。 请提供SHOW CREATE TABLE 和所需输出的样本。我不明白“license_no 具有最大数量的不同类型” 【参考方案1】:

要使此运行快速运行的唯一方法是预先聚合。您可以使用mytable 上的触发器来执行此操作。您的写入会慢一些,但上面的查询只需要扫描一个小得多的表。

【讨论】:

关于汇总表的更多信息:mysql.rjweb.org/doc.php/summarytables 如果没有更多信息,不可能在一秒钟内完成查询。目前这只是不太可能。

以上是关于对超过百万行进行排序的分组的主要内容,如果未能解决你的问题,请参考以下文章

三、MySQL数据库之分组排序

Pandas - 按函数和总和列分组以提取其他列总和为 0 的行

mongo对分组数据进行排序

如果行之间的差异超过 1 分钟,如何对数据进行分组

SQL如何对分组后的结果进行排序并且取前几名

如何在AngularJS ui-grid中对分组行进行排序?