加入收藏 | 设为首页 | 会员中心 | 我要投稿 济源站长网 (https://www.0391zz.cn/)- 数据工具、数据仓库、行业智能、CDN、运营!
当前位置: 首页 > 站长学院 > MySql教程 > 正文

MySQL亿级数据数据库优化方案测试-银行交易流水记录的查询

发布时间:2019-06-06 17:45:12 所属栏目:MySql教程 来源:逸宸a
导读:对MySQL的性能和亿级数据的处理方法思考,以及分库分表到底该如何做,在什么场景比较合适? 比如银行交易流水记录的查询 限盐少许,上实际实验过程,以下是在实验的过程中做一些操作,以及踩过的一些坑,我觉得坑对于读者来讲是非常有用的。 首先:建立一

说白了,连接满了,超时,数据库都不给我返回值了,所以这种实验,不找100台机器,也别可一台机器去霍霍,因为如果能快,那个1个亿的大表,返回的也不会慢。这时候拼的就是计算能力了,都在一台机器上去做实验,会让你怀疑人生的。

那咋办, 这地方我就假装返回都是1000毫秒,也就1秒,然后每个线程都在1秒的时候都给我返回值,这个值我写死,可以看看多线程分布式统计count的效果。

最后总体耗时,就是最后那个返回时间最长的线程返回的时间,所以理论上100个线程同时启动,应该在1秒完成,但线程这玩意有快有慢,所以1秒多一点,也是可以接受的。如果碰上都是机器性能好的时候,所有数据库返回都在1秒以内,那么也就是1秒了。

这个多线程编程可以试试类似Java的countDownLatch/AKKA 将异步多线程结果同步返回。

最后是在数据库数据量比较大的时候,通过MySQL以上的特性,进行不同场景应用的思考。

场景:银行交易流水记录的查询

  1.  根据小总结六的特性,操作表和历史查询表一定要时间可以分开,由于带索引的历史表,插入会很慢,所以要插入到操作表内,操作表和历史表的字段是一样的。
  2.  根据小总结二特性,然后固定某个时间点,比如半夜12点,或者固定日期,或者选择非交易查询活跃的时间,把操作表里的数据往历史表里插一下,由于重建索引也用不了太久,一样半个小时左右。让两种表并存。还有另外一种策略,由于流水主要以时间做为排序对象,可以按照时间顺序,也就是ID自增长的顺序进行分库分表,就像试验的那样,100万左右条数据一张表,另外在做一张时间范围的索引表,如下: 
  1. CreateTimeIndexTable  
  2. ID  TableName   CreateTimeStart CreateTimeEnd  
  3. 1   yun_cashflow_1  2018-10-22 09:06:58 2018-10-26 09:06:58  
  4. 2   yun_cashflow_2  2018-10-26 09:06:58 2018-10-29 09:06:58  
  5. 3   yun_cashflow_3  2018-11-12 09:06:58 2018-11-22 09:06:58  
  6. 4   yun_cashflow_4  2018-11-22 09:06:58 2018-11-26 09:06:58 

当遇见这样语句需求的时候:

  1. select * from yun_cashflow where money<62 and userid=32 and  createtime between '2018-10-27 09:06:58' and '2018-10-28 09:06:59' 

1)、就改写成这样的顺序

  1. select TableName from CreateTimeIndexTable where CreateTimeStart>  '2018-10-27 09:06:58' and CreateTimeEnd < '2018-10-28 09:06:59' 

2)、当得到TableName的时候,结果是yun_cashflow_2,在进行语句的查询

  1. select * from yun_cashflow_2 where money<62 and userid=32 and  createtime between '2018-10-27 09:06:58' and '2018-10-28 09:06:59' 

这样,两遍就可以查询到结果。

不过也有可能查询的结果是多个,比如

  1. select TableName from CreateTimeIndexTable where CreateTimeStart>  '2018-10-27 09:06:58' and CreateTimeEnd < '2018-11-13 09:06:59' 

yun_cashflow_2,和yun_cashflow_3,这个时候,就需要把两个表的结果都查询出来,进行merge。相信程序员们对两个表的结果集合并逻辑都不是什么难事,这地方不多解释。

这样做的好处,主要是每次重建索引的时候,就不用整个1个亿的大表进行重建,而是只重建最近的1百万的那张分出来的表,速度会很快的。

  3.  根据小总结一和小总结三的特性,把关键的字段加上索引,用户,时间,这样保证查询的速度。

  4.  根据小总结四的特性,尽量限制查询结果的数量范围,比如,单个人查自己的交易明细,可以限制范围,比如查询时间范围不超过三个月,或半年,或一年。

【编辑推荐】

  1. 达梦DM8新品发布 国产数据库迎来新的里程碑
  2. 成也数据库 败也数据库 Oracle 如何云渡劫?
  3. 6月数据库排行:PostgreSQL 和 MongoDB 分数罕见下降
  4. MySQL导致CPU消耗过大,如何优化
  5. MySQL索引原理与应用:索引类型,存储结构与锁
【责任编辑:庞桂玉 TEL:(010)68476606】
点赞 0

(编辑:济源站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读