亿级数据mysql优化
2017-11-20 11:40
218 查看
亿级数据优化
情况简介
用户分析系统以用户的心跳数据为依据,统计查询用户的各种情况。心跳数据很多,经过去重,去无效,数据量还是在2亿/月的水平。普通的查询在这个量级的数据库上根本查不出来,为此,分表分库、优化查询、多线程查询就很有必要了。分表分库
对于大数据查询,我的第一反应就是分表分库,我之前对分表分库已经听的很多了,但自己之前并没有真的做过分表分库。我经常说分表分库,经常听分表分库,对分表分库的技术充满了兴趣,所以这次,我的意见就是上分表分库。分库分表就是按一定规则把一张大表的数据切成多个小表,查询时分组查询多个小表再把结果集集合起来。分表其实只是对数据表的数据量的减少。比如一个1亿的表,经过分表后,会分成4个千万级别的表,对于查询sql,会在千万级别的表中执行,并把结果合并起来。在亿级查询的时间比千万级会提高很多,这个就是分表的作用。但是分表仅仅是数据量的减少,并没有去解决查询慢的问题,如果一个查询慢,及时使用分表,它还是很慢。
我们最终用mycat这个数据库中间件来进行分库分表,mycat启动后,会开启一个模拟mysql的服务端,对于插入的sql,它可以按规则自主放入对应的表中,对应查询的sql,它会自动的去各个数据库查询,并自动整合结果。
优化查询
经过对数据库的了解后,我发现,数据库查询的最该优化的地方还是数据库优化。首先就是加索引
索引要加给需要查询的列,对于执行的sql,我们要使用
EXPLAIN进行查询分析,看查询是否走的索引。
如果查询返回的数据过多,会导致cpu和内存占用过大,用
show profile for query去查看查询状态时,sending data过大时,就可能是返回数据过多。sending data的耗时来源于sending和sort的时间之和,去掉排序,时间也能快很多。还要关注一下limit这里,比如
limit 2000,60它这里实际会走一个扫描前2000个,如果有条件就比较好了,比如
id>2000 limit 1,60这样其实就好的很多。所以对于返回结果比较大的查询,引出了第二个策略
切分条件
切分条件就是查询的时候将条件分的细一些,这样查出的每段数据都很少一些,limit的时候,扫描也少一些。
多线程查询
既然做了切分条件,那么多线程查询也是必不可少的。多线程查询再聚合数据,这才能将时间效率提到最高,对与多线程,主要还是java后台做的,多线程的常见操作有,CountDownLatch同步
即在CountDownLatch中,代码多线程执行,主线程挂起,等CountDownLatch的那些多线程全部执行完毕后,在去执行主线程。LinkedBlockingQueue/ConcurrentLinkedDeque队列
LinkedBlockingQueue/ConcurrentLinkedDeque是一个线程安全队列,那个block单词是锁的意思,其实就是堵塞的。在这里的查询就需要队列呀,查询条件是一个list,要保证list的每一个条件查询一次,不能重复查询,这里,就必须要用队列了。queue有两个方法add()、pull(),一个出对,一个入队。相关文章推荐
- 小米架构师:亿级大数据实时分析与工具选型
- 亿级数据量高并发下数据库水平切分的结构设计-02
- FEA大数据实践之亿级数据量处理
- 亿级数据的高并发通用搜索引擎架构设计
- SQL优化(SQL TUNING)之10分钟完成亿级数据量性能优化(SQL调优)
- Mongodb亿级数据量的性能测试(转)
- SQL优化(SQL TUNING)之10分钟完毕亿级数据量性能优化(SQL调优)
- 使用Python Pandas处理亿级数据
- 快速生成导入亿级测试数据到sqlserver
- 上亿级数据量-JDBC插入数据库
- Mongodb亿级数据量的性能测试
- Facebook如何运用机器学习进行亿级用户数据处理
- Mongodb亿级数据量的性能测试
- mysql如何处理亿级数据的SQL 注意事项
- 上亿级数据量-JDBC插入数据库
- 亿级数据的高并发通用搜索引擎架构设计
- [置顶] 【python 处理亿级数据】使用 Pandas 处理亿级数据
- 使用Python Pandas处理亿级数据
- Facebook如何运用机器学习进行亿级用户数据处理
- JAVA快速排序——亿级体量数据