对超过百万行进行排序的分组
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 如果没有更多信息,不可能在一秒钟内完成查询。目前这只是不太可能。以上是关于对超过百万行进行排序的分组的主要内容,如果未能解决你的问题,请参考以下文章