mysql 并发测试
针对上一节做一些针对公司业务的测试。
我们来做一些压力测试。
服务器配置:
操作系统: centos 5.6-64
CPU: 8核
内存: 8G
硬盘:sas
文件系统:linux
MySQL:5.6.
网卡: 100M
网络环境: 良好
数据库表:
c_account_customer,这里用来根据id查询、更新某些字段
CREATE TABLE `c_account_customer` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT '表主键',
`customer_id` int(10) unsigned NOT NULL COMMENT '客户号',
`item_id` int(10) unsigned NOT NULL COMMENT '科目号',
`ref_id` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '业务识别号',
`debit_balance` decimal(14,2) DEFAULT NULL COMMENT '借方余额',
`credit_balance` decimal(14,2) DEFAULT NULL COMMENT '贷方余额',
`last_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '最后更新时间',
PRIMARY KEY (`id`),
UNIQUE KEY `customer_id` (`customer_id`,`item_id`,`ref_id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;
c_entry_company用来插入借、贷科目信息
CREATE TABLE `c_entry_company` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT '表主键',
`entity_id` int(10) unsigned NOT NULL COMMENT '机构号',
`item_id` int(10) unsigned NOT NULL COMMENT '科目号',
`ref_id` int(11) NOT NULL DEFAULT '0' COMMENT '业务识别号',
`direction` tinyint(3) unsigned NOT NULL COMMENT '记账方向',
`amount` decimal(10,0) NOT NULL COMMENT '记账金额',
`operation` int(11) DEFAULT NULL COMMENT '操作类型号',
`operation_id` int(11) DEFAULT NULL COMMENT '操作流水号',
`note` varchar(200) DEFAULT NULL COMMENT '业务备注',
`create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '数据创建时间',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
testvalue表,用来记录事务中查询到的字段值,进行结果分析:
CREATE TABLE `testvalue` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`val` decimal(14,2) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
针对上述三个数据表的事务操作:
CREATE DEFINER=`root`@`localhost` PROCEDURE `Test`(out debitb decimal(14,2))
BEGIN
START TRANSACTION ;
select @db:=debit_balance from c_account_customer where id=1 for update;
set debitb=@db;
insert into abacus.testvalue (val) values (@db);
insert into abacus.c_entry_customer (customer_id,item_id,ref_id,direction,amount,operation,operation_id,note) values (1,1,1,1,1,1,1,1);
insert into abacus.c_entry_customer (customer_id,item_id,ref_id,direction,amount,operation,operation_id,note) values (1,2,1,1,1,1,1,1);
update abacus.c_account_customer set debit_balance=@db+1 where id=1;
commit;
END
C#测试代码
public static void TestComplicating()
{
Console.WriteLine("开始:"+DateTime.Now);
bool b = true;
int num = 0;
DateTime start = DateTime.Now;
while (b)
{
num++;
Complicating();
if (DateTime.Now.AddMinutes(-30)>start)
{
b = false;
}
}
Console.WriteLine("结束:" + DateTime.Now+";循环次数:"+num);
}
public static void Complicating()
{
for (int i = 0; i < 10; i++)
{
Thread thread = new Thread(new ParameterizedThreadStart(Execution));
thread.Start(i);
}
}
public static void Execution(object i)
{
MySqlParameter debitb = new MySqlParameter("?debitb", MySqlDbType.Decimal);
debitb.Direction = ParameterDirection.Output;
IDataParameter[] parameters = new IDataParameter[] {
debitb
};
mysqlhelper.RunProcedure("Test", parameters, "test");
//Task.Factory.StartNew(() =>Logs.jobStatus.Info("更新前值:"+debitb.Value+";当前线程id:" + Thread.CurrentThread.ManagedThreadId + ";循环:" + (int)i));
}
第一组测试结果
Mysql 服务器最大连接数: 1024
.net 客户端连接池最大连接数:500
不模拟耗时操作
测试前先插入一条数据:insert into abacus.c_account_customer (customer_id,item_id,ref_id,debit_balance,credit_balance)values(1,1,1,10000,10000);
第1次: 100个并发 ,完成耗时3秒,无数据丢失,无数据错误。
第2次: 500个并发 ,完成耗时10秒,无数据丢失,无数据错误。
第3次: 5个并发,while循环中持续1分钟,完成耗时1分钟,事务次数171540,无数据丢失,无数据错误。
第4次: 10并发,while循环中持续10分钟,完成耗时10分钟,事务1885640次数 ,无丢数据( c_entry_company中3771280条数据),无数据错误(debit_balance=1895640.00 =1885640+10000)。
第5次: 10并发,while循环中持续30分钟,完成耗时30分钟,循环次数(694861),事务6948610次数 ,无丢数据( c_entry_company中13897220条数据),无数据错误(debit_balance=6958610.00 =6948610+10000)。
图例:




上图中 ,
图1,2 为第4次测试时mysql服务器截图。
图3为第4次测试时mysql服务器每秒执行事务次数。
图4为第5次测试时mysql服务器每分钟执行事务次数。
注:欢迎提出更优、合理的方案。
mysql 并发测试的更多相关文章
- MySQL 并发测试中,线程数和数据库连接池的实验
我一直以来,对性能测试中,连接池的大小要如何配置,不是太清楚: 就我所知道的,就DB自带对连接数的限制,在sqlserver中用select @@connection 可以查到, 在代码中,可以配置D ...
- paip.提升性能---mysql 性能 测试以及 参数调整.txt
paip.提升性能---mysql 性能 测试以及 参数调整.txt 作者Attilax 艾龙, EMAIL:1466519819@qq.com 来源:attilax的专栏 地址:http://b ...
- spring boot2.0.4集成druid,用jmeter并发测试工具调用接口,druid查看监控的结果
一.项目介绍(本项目用的编程语言是jdk8,项目源码:https://github.com/zhzhair/spring-boot-druid.git) 1.引入pom依赖: <dependen ...
- 使用mysqlslap进行MySQL压力测试
使用mysqlslap进行MySQL压力测试发表于236 天前 ? MySQL ? 暂无评论 MySQL从5.1.4版开始带有一个压力测试工具mysqlslap,通过模拟多个并发客户端访问mysql来 ...
- mysql 通过测试'for update',深入了解行锁、表锁、索引
mysql 通过测试'for update',深入了解行锁.表锁.索引 条件 FOR UPDATE 仅适用于InnoDB存储引擎,且必须在事务区块(BEGIN/COMMIT)中才能生效. mysql默 ...
- mysql基础测试
mysql基础测试 测试原因 为什么需要做性能测试 模拟比当前系统更高的负载,找出性能瓶颈 重现线上异常 测试不同硬件软件配置 规划未来的业务增长 测试分类 性能测试的分类 设备层的测试 ...
- Atitit.并发测试解决方案(2) -----获取随机数据库记录 随机抽取数据 随机排序 原理and实现
Atitit.并发测试解决方案(2) -----获取随机数据库记录 随机抽取数据 随机排序 1. 应用场景 1 2. 随机抽取数据原理 1 3. 常用的实现方法:::数据库随机函数 1 4. Mssq ...
- MySQL Router 测试使用 转
MySQL Router 测试使用 . 特性 MySQL Router 并没有包括一些特别新的特性, 总体上看中规中矩, 不过 first-available 和插件两个特性挺有意思, 后续会进行讲解 ...
- appium 并发测试
Android并发测试 Appium提供了在一台设备上启动多个Android会话的方案,而这个方案需要你输入不同的指令来启动多个Appium服务来实现. 启动多个Android会话的重要指令包括: - ...
随机推荐
- 第十八次ScrumMeeting会议
第十八次Scrum Meeting 时间:2017/12/8 地点:线上+SPR咖啡馆 人员:蔡帜 王子铭 游心 解小锐 王辰昱 李金奇 杨森 陈鑫 赵晓宇 照片: 目前工作进展 名字 今日 明天的工 ...
- c++ 反射类型
来自: 实现代码=== // // Created by lizhen on 2017/9/29. // #ifndef BOOST_ALL_CALLBACKFUNCTION_H #define BO ...
- oracle数据库之存储函数和过程
一.引言 ORACLE 提供可以把 PL/SQL 程序存储在数据库中,并可以在任何地方来运行它.这样就叫存储过程或函数.过程和函数统称为 PL/SQL 子程序,他们是被命名的 PL/SQL 块 ...
- position定位-absolute与fixed
1. absolute 生成绝对定位元素,相对于static定位以外的第一个父元素进行定位. 2. fixed 生成绝对定位元素,相对于浏览器窗口进行定位.
- linux路由表的配置
linux路由表的配置 一.原理说明 1.路由表(table)从0到255进行编号,每个编号可以对应一个别名,编号和别名的对应关系在linux下放在/etc/iproute2/rt_tables这个文 ...
- 【bzoj1143】[CTSC2008]祭祀river Floyd+网络流最小割
题目描述 在遥远的东方,有一个神秘的民族,自称Y族.他们世代居住在水面上,奉龙王为神.每逢重大庆典, Y族都会在水面上举办盛大的祭祀活动.我们可以把Y族居住地水系看成一个由岔口和河道组成的网络.每条河 ...
- 【bzoj1704】[Usaco2007 Mar]Face The Right Way 自动转身机 贪心
题目描述 农夫约翰有N(1≤N≤5000)只牛站成一排,有一些很乖的牛朝前站着.但是有些不乖的牛却朝后站着.农夫约翰需要让所有的牛都朝前站着.幸运的是约翰最近买了一个自动转身机.这个神奇的机器能使K( ...
- 【hackerrank】Week of Code 26
在jxzz上发现的一个做题网站,每周都有训练题,题目质量……前三题比较水,后面好神啊,而且类型差不多,这周似乎是计数专题…… Army Game 然后给出n*m,问需要多少个小红点能全部占领 解法:乘 ...
- POJ3581:Sequence——题解
http://poj.org/problem?id=3581 给一串数,将其分成三个区间并且颠倒这三个区间,使得新数列字典序最小. 参考:http://blog.csdn.net/libin56842 ...
- POJ3974:Palindrome——题解
http://poj.org/problem?id=3974 题目大意: 求最大回文子串长度. ———————————————————— 马拉车板子题. 马拉车大概讲解: 首先在每两个字母之间插入‘# ...