靠数据库的 group by 不可取,这不是什么数据库的问题,group by 是数据库最慢的执行操作之一,而且还需要消耗大量内存和 CPU 。 建议 lz 要么采用上面说的字典树,要么了解下现在行为分析的玩法,用数组或者在数据库里用 map 结构预聚合。别说 1s 了,我们百亿级别的数据 60ms 就能出。3 台节点的 gp 。
magiclx
2021-01-25 12:08:26 +08:00
因为问题并不是从 13 亿短字符串中统计出现频率最高的 10 个,而是 13 亿人口姓名数据。
人口姓名是相对稳定的,你只要计算一次存量数据,然后计算增量即可随时把结果拿出来。具体来说:
1 、通过 Google 获知我国每日平均出生人数 2 万多,每日死亡人数为 1 万多,具体数值不重要,知道规模为 5 万以下即可。 2 、建一张统计表 S 存目前排名前 5 万的姓名和人数,当人员出生,人数增加,把该姓名人数加 1 后 REPLACE INTO 到表 S 中,当人员死亡,人数减少,如果死亡人员姓名在表 S 中,则人数减一。 3 、定时删除表 S 中大于 5 万的数据。 4 、当需要统计出 13 亿人口中使用人数最多的十个姓名时,只要 SELECT TOP 10 即可,因为只有 5 万数据,所以无论如何都会在 1S 内。