如何有效地在数据库中存储频繁数据(源 - 目的地的组合)以获得过去30天的前10个搜索

时间:2016-09-16 05:39:37

标签: java mysql algorithm sorting

我正在尝试编写一种插入频繁数据搜索的算法。 假设用户可以搜索两个实体的不同组合(源 - 目的地),每次用户搜索我想用计数存储数据,如果他搜索相同的组合(源 - 目的地),我将更新计数。 在这种情况下,如果用户为1000,并且用户搜索0个不同的组合(源 - 目的地),则数据将被存储30天。

因此总行数将为100000 * 30 * 30 = 13500000(13亿)行。 (使用Mysql)

请建议我如果有更好的方式来写这个。

目标:我想在任何时间点获得前10名Searach用户组合。

1 个答案:

答案 0 :(得分:0)

根据今天的标准,

1,000用户和60,000行都不算什么。不要考虑它,没有任何性能问题,所以只需专注于正确地做,而不是担心缓慢。没有缓慢。

正确的方法是创建一个表,其中每行包含搜索项(在您的情况下为[source,destination])和一个总和,并在[source,destination]上使用唯一索引一对列。这与将这两列作为主键相同。

如果你有100,000,000行,并且表现很关键,并且你也有巨额预算为你提供奢侈品来做任何奇怪的事情来维持生计,那么你可能想做一些充满异国情调的事情,例如将每个搜索附加到无索引表(允许最快的附加可能),然后在每晚批处理过程中计算总和。但是,如果不到一百万行,这样的方法将是一个完全的过度杀伤。

编辑:

啊哈,所以真正的问题是OP需要一个“滑动窗口”。那么,在这种情况下,我看不到任何方法,除了保存每一次搜索,以及它发生的时间,以及批处理a)计算总和,以及b)删除比“窗口”更旧的条目。