当前位置: 首页 > news >正文

缓存遇到的数据过滤与分页问题

遇到的问题

1、最初阶段

系统中做了一个监控功能,用于记录所有的请求数据,数据插入频繁,量非常大,比如一天1000万条。考虑到数据插入的效率,就使用内存KV缓存来保存。写入过程是在接收到请求后放入到线程池中,然后线程池异步处理后写入。到这问题基本上没什么事情。

2、新的需求

后面数据保存了,就需要在运维系统中可以查询到,所以这个缓存还必须是分布式的。于是就换成了redis,这样系统都可以连接到。但是数据量太大,需要分页查询,这就有点头痛了。还好redis是可以支持有序集合的,而且可以通过zrange来获取指定范围数据。

3、增加了需求

这些数据要在运维界面里还要可以按条件过滤,这个就非常头疼啦,redis没有条件过滤啊。即使过滤出来了数据要显示在界面上必须分页。

问题思考

最终突然发现如果存在数据库里是不是很好解决?但是存在数据库里就会有大量写操作的问题,而且数据这么大,像Mysql单表很容易就破了。所以我想着是不是还是在nosql的基础上解决。

这里就有几个问题:大数据量的排序、查找过滤、分页。

先不管这么多,如果使用Mysql的话,除了大表保存问题,查找、过滤、分页功能都是直接使用sql实现的,开发起来简单。

mysql

如果使用mysql存储后,如果要查一些数据怎么整?先看下面的这段代码:

SELECT t.* 
    from ofOffline1 t 
    ORDER BY t.creationDate desc
  LIMIT 1300000,100

这里最直接的就体现了两点:先排序,然后取分页的数据。好了,这里有几个问题:

1、使用了*返回字段,全字段返回的问题就是要扫描全表
2、进行了ORDERBY排序,我测试的这个表只有几百万数据
3、最后分页是取的130万开始的100条,等于是要扫描130万后才开始

我随便跑了一下执行了:5.5秒左右。有没有办法让它快一点呢?确实有,网上找找挺多的。

首先,看看只返回部分字段是不是快一些?

SELECT t.creationDate 
    from ofOffline1 t 
    ORDER BY t.creationDate desc
  LIMIT 1300000,100

上面的SQL语句,改造后,只返回一个字段,再执行。2.9秒了。

那么取1条数据的速度会不会快一些呢?

SELECT t.creationDate 
    from ofOffline1 t 
    ORDER BY t.creationDate desc
  LIMIT 1300000,1

执行上面的sql后发现时间还是2.9秒,这说明取1条的数据也是这么慢,那慢的肯定就是排序啦。

然后使用这一条取出来的数据作为条件,直接在集合中定位到分页数据

SELECT ofOffline1.* FROM ofOffline1 WHERE ofOffline1.creationDate <(
SELECT t.creationDate 
    from ofOffline1 t 
    ORDER BY t.creationDate desc
  LIMIT 1300000,1
) 
ORDER BY ofOffline1.creationDate desc
LIMIT 100

这是网上查到的SQL,思路就是先使用子查询定位到第130万条记录,然后从它开始取后面的99条。时间差不多3.9秒左右。这说明这样的优化还是有效的。

使用一下索引
我想了想如果加个索引是不是可以提升性能呢?SQL中只使用了creationDate排序和过滤,那么就用它建个索引试试吧。

还是测试一下最简单的那条SQL

SELECT t.* 
    from ofOffline1 t 
    ORDER BY t.creationDate desc
  LIMIT 1300000,100

结果是:5.5秒左右,没变化

那么看看前面有子查询的情况:

SELECT ofOffline1.* FROM ofOffline1 WHERE ofOffline1.creationDate <(
SELECT t.creationDate 
    from ofOffline1 t 
    ORDER BY t.creationDate desc
  LIMIT 1300000,1
) 
ORDER BY ofOffline1.creationDate desc
LIMIT 100

不错,执行结果:0.599秒。

好吧,本文先到这,后面再学习一下mangodb,按理它会比较适合我们的场景。

转载于:https://www.cnblogs.com/5207/p/6297020.html

相关文章:

  • 通过libVirt抓取kvm虚拟机监控指标数据
  • Eclipse+Pydev
  • TTL和RS232之间的详细对比
  • NSMutableArray崩溃信息
  • 艰困之道中学到的经验教训
  • 【JAVA秒会技术之随意切换数据库】Spring如何高效的配置多套数据源
  • 国外的搜索引擎,能查到好多资料
  • 基于nginx的负载均衡概述与实现
  • 总结2016,规划2017
  • GreenOpenPaint的实现(二)打开显示图片
  • CSS命名规范:
  • 桌面开发者的界面故事,该醒醒了
  • yii2中session跨域名的问题
  • MVC,MVP,MVVM
  • android设备分辨率及sp、px计算
  • 【React系列】如何构建React应用程序
  • Cookie 在前端中的实践
  • ES6之路之模块详解
  • Java知识点总结(JDBC-连接步骤及CRUD)
  • k8s如何管理Pod
  • magento 货币换算
  • redis学习笔记(三):列表、集合、有序集合
  • Twitter赢在开放,三年创造奇迹
  • Web设计流程优化:网页效果图设计新思路
  • 阿里云前端周刊 - 第 26 期
  • 浮现式设计
  • 高程读书笔记 第六章 面向对象程序设计
  • 聊聊spring cloud的LoadBalancerAutoConfiguration
  • 浏览器缓存机制分析
  • 删除表内多余的重复数据
  • 由插件封装引出的一丢丢思考
  • 找一份好的前端工作,起点很重要
  • ​如何在iOS手机上查看应用日志
  • # 再次尝试 连接失败_无线WiFi无法连接到网络怎么办【解决方法】
  • ( )的作用是将计算机中的信息传送给用户,计算机应用基础 吉大15春学期《计算机应用基础》在线作业二及答案...
  • (04)Hive的相关概念——order by 、sort by、distribute by 、cluster by
  • (day 12)JavaScript学习笔记(数组3)
  • (env: Windows,mp,1.06.2308310; lib: 3.2.4) uniapp微信小程序
  • (第27天)Oracle 数据泵转换分区表
  • (独孤九剑)--文件系统
  • (附源码)ssm户外用品商城 毕业设计 112346
  • . ./ bash dash source 这五种执行shell脚本方式 区别
  • ./和../以及/和~之间的区别
  • .L0CK3D来袭:如何保护您的数据免受致命攻击
  • .Net core 6.0 升8.0
  • .NET 依赖注入和配置系统
  • .NET 自定义中间件 判断是否存在 AllowAnonymousAttribute 特性 来判断是否需要身份验证
  • .NET/C# 在 64 位进程中读取 32 位进程重定向后的注册表
  • .NET/C# 阻止屏幕关闭,阻止系统进入睡眠状态
  • .net使用excel的cells对象没有value方法——学习.net的Excel工作表问题
  • //解决validator验证插件多个name相同只验证第一的问题
  • @value 静态变量_Python彻底搞懂:变量、对象、赋值、引用、拷贝
  • [1127]图形打印 sdutOJ
  • [20171101]rman to destination.txt
  • [BUUCTF]-PWN:wustctf2020_number_game解析(补码,整数漏洞)