数据库选型之亿级数据量并发访问(MySQL集群)
刘 勇 Email:lyssym@sina.com
简介
针对实际应用中并发访问MySQL的场景,本文采用多线程对MySQL进行并发读取访问,其中以返回用户所需的数据并显示在终端为测试结束节点,即将数据从MySQL集群读取后存储于客户端本地内存中。测试过程如下:分别针对4种应用场景,从10、20、50、100个线程对MySQL展开测试。测试结果表明:对场景1)一般的并发访问能够满足需求;对于场景2)和3)响应时间在分钟级,分别处于1-3分钟和10分钟左右;对于场景4)则经常会抛出异常,并且以异常点为基准,其响应时间在30分钟左右。
测试环境
硬件环境:
Localhost:CPU: Intel Core I5, 主频:3.10G, 内存:4G
MySQL集群:9台服务器
软件环境:
Localhost: Win7,jdk 1.8
MySQL集群: MySQL5.6.25(社区版)
数据规模:
数据条目:一个月的股票数据,2亿4千万余条记录,表结构为50个字段左右,具体内容见下面表结构。
表结构:
DROP TABLE IF EXISTS `TAQ_201504`;
CREATE TABLE `TAQ_201504` (
`SECCODE` varchar(6) NOT NULL,
`SECNAME` varchar(20) NOT NULL,
`TDATE` varchar(10) NOT NULL,
`TTIME` varchar(6) NOT NULL,
`LASTCLOSE` decimal(19,3) DEFAULT NULL,
`OP` decimal(19,3) DEFAULT NULL,
`CP` decimal(19,3) DEFAULT NULL,
`TQ` decimal(19,3) DEFAULT NULL,
`TM` decimal(19,3) DEFAULT NULL,
`TT` decimal(18,0) DEFAULT NULL,
`CQ` decimal(18,0) DEFAULT NULL,
`CM` decimal(19,3) DEFAULT NULL,
`CT` decimal(19,3) DEFAULT NULL,
`HIP` decimal(19,3) DEFAULT NULL,
`LOP` decimal(19,3) DEFAULT NULL,
`SYL1` decimal(19,3) DEFAULT NULL,
`SYL2` decimal(19,3) DEFAULT NULL,
`RF1` decimal(19,3) DEFAULT NULL,
`RF2` decimal(19,3) DEFAULT NULL,
`BS` varchar(18) DEFAULT NULL,
`S5` decimal(19,3) DEFAULT NULL,
`S4` decimal(19,3) DEFAULT NULL,
`S3` decimal(19,3) DEFAULT NULL,
`S2` decimal(19,3) DEFAULT NULL,
`S1` decimal(19,3) DEFAULT NULL,
`B1` decimal(19,3) DEFAULT NULL,
`B2` decimal(19,3) DEFAULT NULL,
`B3` decimal(19,3) DEFAULT NULL,
`B4` decimal(19,3) DEFAULT NULL,
`B5` decimal(19,3) DEFAULT NULL,
`SV5` decimal(20,0) DEFAULT NULL,
`SV4` decimal(20,0) DEFAULT NULL,
`SV3` decimal(15,0) DEFAULT NULL,
`SV2` decimal(15,0) DEFAULT NULL,
`SV1` decimal(15,0) DEFAULT NULL,
`BV1` decimal(15,0) DEFAULT NULL,
`BV2` decimal(15,0) DEFAULT NULL,
`BV3` decimal(15,0) DEFAULT NULL,
`BV4` decimal(15,0) DEFAULT NULL,
`BV5` decimal(15,0) DEFAULT NULL,
`BSRATIO` decimal(19,3) DEFAULT NULL,
`SPD` decimal(19,3) DEFAULT NULL,
`RPD` decimal(19,3) DEFAULT NULL,
`DEPTH1` decimal(20,3) DEFAULT NULL,
`DEPTH2` decimal(20,3) DEFAULT NULL,
`UNIX` bigint(20) DEFAULT NULL,
`MARKET` varchar(4) DEFAULT NULL,
KEY `SECCODE` (`SECCODE`,`TDATE`,`TTIME`)
) /*!50100 TABLESPACE ts_cloudstore STORAGE DISK */ ENGINE=ndbcluster DEFAULT CHARSET=utf8;
Table TAQ_201504
备注:`SECCODE`,`TDATE`,`TTIME`为组合索引,存于内存中。
性能测试
本文针对4中应用场景展开测试,分别从10、20、50、100个线程对MySQL展开测试。
1) 场景1
对某天的业务进行访问查询,即多个线程交互访问如下示例:
select CP from TAQ_201504 where SECCODE='000001' AND TDATE = '20150401';
select CP from TAQ_201504 where SECCODE='000002' AND TDATE = '20150401';
select CP from TAQ_201504 where SECCODE='000003' AND TDATE = '20150401';
select CP from TAQ_201504 where SECCODE='000004' AND TDATE = '20150401';
select CP from TAQ_201504 where SECCODE='000005' AND TDATE = '20150401';
即每5个线程各自执行其中一条查询,以10个线程举例,则各自有2个线程会执行其中1条语句,其它线程与之类同,不再赘述。测试结果见表-1。

表-1结果表明:对于20-50个线程并发的场景下,按天查询1-3个字段,数据响应时间大概在3s 以内。然而,在大量并发(100个线程)的场景下,数据显示所需时间明显增大。需要指出,虽然该测试能够反映一些问题,但是增大多线程间切换所需的时间也是造成该时延增大的原因。
2) 场景2
对某个字段所处范围,批量返回查询结果,即多个线程并发访问如下示例:
select CP from TAQ_201504 where SECCODE in ('000005','600010','000001','600100','600180','000002','000007','000008')
测试结果见表-2。

表-2结果表明:测试所需时间都已达到分钟级。此外,对于表中异常情形,其症结在于,在单台机器上采用多线程测试,因此受限于本文测试的机器的存储空间。本文作者认为,并非已达到MySQL数据库的极限。
3)场景3
指定具体某一个字段,对全表进行查询,即多线程并发访问如下示例:
select CP from TAQ_201504 where ttime='145910'
测试结果见表-3。需要指出,本文未对50、100个线程展开测试,只是因为其耗时过长,故此,并未展开测试。

表-3结果表明:随着字段个数增加,其处理耗时也逐渐增加,而且已达到分钟级,而且基本达到10分钟以上。
4)场景4
指定具体某些字段,对全表进行查询,即多线程并发访问如下示例:
select CP from TAQ_201504 where tdate='20150409' and ttime='145910'
测试结果见表-4。

从表-4可知:在查询中指定多个字段会增加查询所需的时间。需要指出,由于上述SQL语句在查询时,扫描数据库花费的时间较多,导致Got error 4008 'Receive from NDB failed' from NDBCLUSTER,因此,表-4红色部分,由于异常过早抛出,因此,在统计时间时存在偏差。本文作者认为,由于每次查询差不多花费半个小时,造成数据访问超时,很大程度上造成上述异常,此外,在单台机器上并发访问该数据库,线程间切换的时间也会对其造成一定的影响。
总结
从上述4中场景测试结果来看,对于查询返回数据量相对较少时,多线程访问MySQL是能够满足用户需求的;当访问数据量较大时,多线程访问时能够满足连接需求的,但是具体向用户进行展示时,其处理时间多在分钟级,返回的字段、数据量越多,所耗的时间也逐渐增多。
作者:志青云集
出处:http://www.cnblogs.com/lyssym
如果,您认为阅读这篇博客让您有些收获,不妨点击一下右下角的【推荐】。
如果,您希望更容易地发现我的新博客,不妨点击一下左下角的【关注我】。
如果,您对我的博客所讲述的内容有兴趣,请继续关注我的后续博客,我是【志青云集】。
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接。
数据库选型之亿级数据量并发访问(MySQL集群)的更多相关文章
- Mongodb亿级数据量的性能测试
进行了一下Mongodb亿级数据量的性能测试,分别测试如下几个项目: (所有插入都是单线程进行,所有读取都是多线程进行) 1) 普通插入性能 (插入的数据每条大约在1KB左右) 2) 批量插入性能 ...
- 咏南IOCP中间件支持海量并发方案(集群)
咏南IOCP中间件支持海量并发方案(集群) 支持D7~XE10.1.1开发 支持负载均衡,自动故障转移 可以在不停机的状态下,根据负载情况灵活增加中间件机器 中间件使用IOCP通信,单中间件支持并发数 ...
- ABP 框架 数据库底层迁移 Mysql 集群
技术交流,请加QQ群:538327407 我的各种github 开源项目和代码:https://github.com/linbin524 背景 笔者 目前架构的IOT 项目是使用abp 框架作为后台, ...
- 分库代价高的情况下,如何优化ES解决亿级数据量检索
数据平台已迭代三个版本,从一开始遇到很多常见的难题,到现在终于有片段时间整理一些已完善的文档,在此分享以供所需朋友的实现参考,但愿能帮助大家少走些弯路,在此篇幅中偏重于ElasticSearch的优化 ...
- 高并发访问mysql时的问题(一):库存超减
如果在对某行记录的更新时不采取任何防范措施,在多线程访问时,就容易出现库存为负数的错误. 以下用php.mysql,apache ab工具举例说明: mysql表结构 CREATE TABLE `yx ...
- 2017最新技术java高级架构、千万高并发、分布式集群、架构师入门到精通视频教程
* { font-family: "Microsoft YaHei" !important } h1 { color: #FF0 } 15套java架构师.集群.高可用.高可扩展. ...
- Percona 开始尝试基于Ceph做上层感知的分布式 MySQL 集群,使用 Ceph 提供的快照,备份和 HA 功能来解决分布式数据库的底层存储问题
本文由 Ceph 中国社区 -QiYu 翻译 英文出处:Using Ceph with MySQL 欢迎加入CCTG Over the last year, the Ceph world drew m ...
- 财务平台亿级数据量毫秒级查询优化之elasticsearch原理解析
财务平台进行分录分表以后,随着数据量的日渐递增,业务人员对账务数据的实时分析响应时间越来越长,体验性慢慢下降,之前我们基于mysql的性能优化做了一遍,可以说基于mysql该做的优化已经基本上都做了, ...
- Python 操作 mongodb 亿级数据量使用 Bloomfilter 高效率判断唯一性 例子
工作需要使用 python 处理 mongodb 数据库两亿数据量去重复,需要在大数据量下快速判断数据是否存在 参考资料:https://segmentfault.com/q/101000000061 ...
随机推荐
- MVC文件上传09-使用客户端jQuery-File-Upload插件和服务端Backload组件让每个用户有专属文件夹,并在其中创建分类子文件夹
为用户创建专属上传文件夹后,如果想在其中再创建分类子文件夹,该怎么做?可以在提交文件的视图中再添加一个隐藏域,并设置 name="uploadContext". 相关兄弟篇: MV ...
- 7. python 字符串格式化方法(2)
7. python 字符串格式化方法(2) 紧接着上一章节,这一章节我们聊聊怎样添加具体格式化 就是指定替换字段的大小.对齐方式和特定的类型编码,结构如下: {fieldname!conversion ...
- 跟我一起学extjs5(08--自己定义菜单1)
跟我一起学extjs5(08--自己定义菜单1) 顶部和底部区域已经作好,在顶部区域有一个菜单的button.这一节我们设计一个菜单的数据结构,使其能够展示出不相同式的菜单.因为准备搭建的是一个系统模 ...
- 基于tomcat7 web开发中的一点小东西
控制台: org.apache.jasper.compiler.TldLocationsCache tldScanJar 信息: At least one JAR was scanned for TL ...
- Uber分布式追踪系统Jaeger使用介绍和案例
原文:Uber分布式追踪系统Jaeger使用介绍和案例[PHP Hprose Go] 前言 随着公司的发展,业务不断增加,模块不断拆分,系统间业务调用变得越复杂,对定位线上故障带来很大困难.整个调 ...
- 使用 NSPropertyListSerialization 持久化字典与数组
NSPropertyListSerialization The NSPropertyListSerialization class provides methods that convert prop ...
- Myeclipse设置快捷键
快捷键中把我们习惯性使用的Alt+/进行代码自动补齐的快捷键改为了ctrl+空格,大家知道这是切换中英文输入法的键,所以需要更改这个快捷键, 1.选择MyEclipse6.0菜单栏中的Window-& ...
- Linux进程调度的运行队列
当Linux内核要寻找一个新的进程在CPU上运行时,必须只考虑处于可运行状态的进程,(即在TASK_RUNNING状态的进程),因为扫描整个进程链表是相当低效的,所以引入了可运行状态进程的双向循环链表 ...
- Android实现随机验证码——自定义View
一.问题描述 熟悉web开发中童鞋们都知道为了防止恶意破解.恶意提交.刷票等我们在提交表单数据时,都会使用随机验证码功能.在Android应用中我们同样需要这一功能,该如何实现呢,下面我们就自定义一个 ...
- AT&T汇编语言——简单实例及工具演示
今天就来用详细实例代码来运用一下昨天所说的仅仅个工具的使用方法吧 这几个实例基本的目的是来熟悉一下汇编相关工具的使用方法及应用一下昨天刚说的汇编程序模板. 我们用到的工具主要有as,ld,gcc,gd ...