为了账号安全,请及时绑定邮箱和手机立即绑定

如何实现一个高性能的以时间为条件的查询器?

如何实现一个高性能的以时间为条件的查询器?

拉风的咖菲猫 2019-07-28 12:08:20
现在存在一个案例:现有一个插入线程不断的往数据库里里面插入数据:[{"ts":1562902203,"event":"product1","direction":"buy","price":0.8},{"ts":1562902204,"event":"product1","direction":"sell","price":0.8}]现在存在N个查询线程在做查询操作,查询内容有:当前时间减去X时间内的最高价当前时间减去X时间内的最低价因为存在两个因素:时间和价格,所以这两个都得加索引。查询频率极高,假设X等于5分钟,当前是15:00:00,查询最高价,查询条件是14:55:00-15:00:00内的最高价,假设是14:58:00是最高价。如果当前是15:00:01其他不变,查询条件是14:55:01-15:00:01内的最高价,结果很可能仍然是14:58:00是最高价。两种情况的实际结果很大的情况下是一致的。所以出现了大量的查询纯粹是浪费资源。但是15:00:01是最高价的情况也出现过多次,需求也对数据精准有高要求。现有的运行方案是:mysql5.7ts和price都加索引。select*fromdatawhere`ts`>='14:55:00'orderbypricedesclimit1现在经常会出现mysql的CPU压力特别高,内存压力特别小。现在希望得到一个方案,脱离数据库来排序获取,自己实现一个高效的方案,尽量把查询压力放到应用服务器上来。补充一下,看到大家的答案都是在讨论怎么缓存历史最高价。重点是14:55:01-15:00:01的最高价与14:55:00-15:00:00不一定是重合的,只是可能重合。如果重合,那么是可以存下来last_max_price,用于减少筛选范围。但是在查询前是不知道是否重合的,而且这个历史的last_max_price,只对重合有效,如果不重合是完全没有意义的。这个需求的最大问题是区间每次都是变化的。下一次查询的起点是14:55:01,上一次是14:55:00,起点不同结尾是15:00:01,上一次是15:00:00,也是不同的,如果上一次的最高价出现在14:55:00,那么现有答案的缓存方案都是无效的。
查看完整描述

2 回答

?
泛舟湖上清波郎朗

TA贡献1818条经验 获得超3个赞

最高最低存在分配律:(区间1+区间2)的max===max(区间1的max,区间2的max)
因此如果在内存中有一些区间的缓存,一次查询结果的大半可能可以用缓存拼出来,拼不出的部分(小于最小缓存单位的区间,还不在缓存的区间)才用DB
具体怎么缓存比较随意,可能树或map都行
注意:如果新数据的ts可能是任意值,你还需要正确处理缓存过期
                            
查看完整回答
反对 回复 2019-07-28
  • 2 回答
  • 0 关注
  • 245 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信