说白了,连接满了,超时,数据库都不给我返回值了,所以这种实验,不找100台机器,也别可一台机器去霍霍,因为如果能快,那个1个亿的大表,返回的也不会慢。这时候拼的就是计算能力了,都在一台机器上去做实验,会让你怀疑人生的。
那咋办, 这地方我就假装返回都是1000毫秒,也就1秒,然后每个线程都在1秒的时候都给我返回值,这个值我写死,可以看看多线程分布式统计count的效果。
最后总体耗时,就是最后那个返回时间最长的线程返回的时间,所以理论上100个线程同时启动,应该在1秒完成,但线程这玩意有快有慢,所以1秒多一点,也是可以接受的。如果碰上都是机器性能好的时候,所有数据库返回都在1秒以内,那么也就是1秒了。
这个多线程编程可以试试类似Java的countDownLatch/AKKA 将异步多线程结果同步返回。
最后是在数据库数据量比较大的时候,通过MySQL以上的特性,进行不同场景应用的思考。
场景:银行交易流水记录的查询
- 根据小总结六的特性,操作表和历史查询表一定要时间可以分开,由于带索引的历史表,插入会很慢,所以要插入到操作表内,操作表和历史表的字段是一样的。
- 根据小总结二特性,然后固定某个时间点,比如半夜12点,或者固定日期,或者选择非交易查询活跃的时间,把操作表里的数据往历史表里插一下,由于重建索引也用不了太久,一样半个小时左右。让两种表并存。还有另外一种策略,由于流水主要以时间做为排序对象,可以按照时间顺序,也就是ID自增长的顺序进行分库分表,就像试验的那样,100万左右条数据一张表,另外在做一张时间范围的索引表,如下:
- CreateTimeIndexTable
- ID TableName CreateTimeStart CreateTimeEnd
- 1 yun_cashflow_1 2018-10-22 09:06:58 2018-10-26 09:06:58
- 2 yun_cashflow_2 2018-10-26 09:06:58 2018-10-29 09:06:58
- 3 yun_cashflow_3 2018-11-12 09:06:58 2018-11-22 09:06:58
- 4 yun_cashflow_4 2018-11-22 09:06:58 2018-11-26 09:06:58
当遇见这样语句需求的时候:
- 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)、就改写成这样的顺序
- 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,在进行语句的查询
- 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'
这样,两遍就可以查询到结果。
不过也有可能查询的结果是多个,比如
- 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. 根据小总结四的特性,尽量限制查询结果的数量范围,比如,单个人查自己的交易明细,可以限制范围,比如查询时间范围不超过三个月,或半年,或一年。
【编辑推荐】
- 达梦DM8新品发布 国产数据库迎来新的里程碑
- 成也数据库 败也数据库 Oracle 如何云渡劫?
- 6月数据库排行:PostgreSQL 和 MongoDB 分数罕见下降
- MySQL导致CPU消耗过大,如何优化
- MySQL索引原理与应用:索引类型,存储结构与锁
【责任编辑:庞桂玉 TEL:(010)68476606】
点赞 0 (编辑:青岛站长网)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|