Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >MySQL 性能测试经验

MySQL 性能测试经验

原创
作者头像
serena
修改于 2021-08-03 06:56:04
修改于 2021-08-03 06:56:04
10.7K00
代码可运行
举报
文章被收录于专栏:社区的朋友们社区的朋友们
运行总次数:0
代码可运行

作者 :何龙

一、背景

近期在进行资源调度管理平台的重构工作,其中的Resource/Property数据库设计,在没有更加优化的方案前,打算沿用当前平台的数据库结构;这就需要对当前平台的数据库结构进行剖析研究,并对其性能进行测试与分析,得出的数据结果作为后续设计和优化的参考。

二、测试方法

1、测试工具:mysqlslap,mysqlslap是MySQL5.1.4之后自带的benchmark基准测试工具,该工具可以模拟多个客户端同时并发的向服务器发出查询更新,给出了性能测试数据而且提供了多种引擎的性能比较。官方介绍:http://dev.mysql.com/doc/refman/5.6/en/mysqlslap.html, 使用方法:http://my.oschina.net/moooofly/blog/152547

2、测试流程:建立测试数据库database和待测试的表tables → 根据table的结构,利用脚本生成一定数量的有效随机数据 → 利用mysqlslap对相应query语句进行测试 → 结果数据的分析。

3、关键语句:考虑到资源平台的实际应用情况,通过资源属性查询资源的操作为主要操作,且这类操作的耗时占总操作耗时的比例为最大,故对应这类操作的查询语句为关键语句,对整个数据库性能影响很大,我们可以通过测试这个关键语句得出的结果来评估整个数据库的性能。

三、测试过程

1、建表:

通过属性查询资源需要两张表:设备表device和设备属性对应表deviceattr。device表对应资源,记录资源的基本信息,如name,type,group,creator等等;deviceattr表对应资源和属性的关系,记录每个资源的每个属性和属性值;它们的结构如下所示:

通过多个属性组合查询deviceattr表,获得相应的id ,id即是满足条件的设备id,进而能直接在device表中查询得到其基本属性。

本次测试的关键语句即是从deviceattr表中组合查询出满足条件的id,故本测试只需要用到deviceattr一张表。

2、生成随机数据并插入相应的表中:

这里编写了几个生成随机数据的sql函数rand_name(),rand_value(),rand_num(),rand_creator(),并编写了存储过程insert_devattr,用来将一定量数据批量插入deviceattr表中。

然后将整个建表和存储数据的过程写进一个sql脚本中,并在mysql中运行这个脚本,待测试的表和数据就建立好了。(sql脚本在附录)如下图所示,生成的deviceattr随机数据有4020条:

3、利用mysqlslap进行测试:

整个数据库的关键操作为通过属性查询资源,该操作的关键sql语句就是:

select id from deviceattr where [ n attr ] group by id;

例:查询拥有attr10或者attr20属性的所有资源的id为:

select id from deviceattr where name = ‘attr10’ or name = ‘attr20’ group by id;

在建立好待测数据库后,就可以利用mysqlslap进行测试,mysqlslap命令如下所示:

shell < mysqlslap --create-schema='test1' --query="select id from deviceattr where name='attr10' or name='attr20' group by id;" -c 50 -i 100

以上语句表示:使用test1数据库,使用query所指定的语句,测试50个并发查询,每一个查询100次。

该语句的测试结果如下图所示:

结果中可以看到执行语句的平均耗时,最大耗时和最小耗时,并发线程数等等。

四、结果分析

在不同数据容量,不同并发数,不同查询属性数的条件下进行多次测试并取平均值,所得到的数据分以下几种情况进行分析:

1、在deviceattr表数据容量为4000条,并发数分别为1、5、10、20、40、80,查询属性数分别为2、3、4、5、6的情况下,查询语句的耗时:

从上表可以看出,在查询属性数相同条件下,并发数增长一倍,耗时也基本增加一倍;在40并发数以下时,查询耗时不超过100毫秒;在10并发左右的实际应用情况下,耗时在40毫秒左右;性能基本满足新资源平台的要求。

2、在10并发,deviceattr表容量分别为3000、4000、8000条,查询属性数从2至6的情况下,查询语句的耗时:

从上表可以看出,在并发数一定的情况下,随着语句中查询属性数的增多,耗时线性增加,这种线性关系数据容量无关。

3、在10并发,查询属性数为5,不同数据容量的情况下,查询语句的耗时:

从上表可以看出,在其他条件一定的情况下,随着数据容量的增长,耗时呈线性增长,在贴近实际条件的情况下(4000左右数据容量,10左右并发数,5左右查询属性),耗时为25毫秒,满足新资源管理平台的需求。

附录:

生成测试数据的sql脚本:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
use test1

drop table if exists device,attr,deviceattr;
drop function if exists rand_name;
drop function if exists rand_value;
drop function if exists rand_num;
drop function if exists rand_creator;
drop procedure if exists insert_devattr;
drop procedure if exists insert_dev;

create table device    
(
id int primary key,
name varchar(40),
type varchar(40),    
aquired int,
groupname varchar(40),
creator varchar(40)
);  


create table attr
(
id int primary key,
name varchar(40)
);


create table deviceattr
(
id int,
name varchar(40),
value varchar(40)
);

delimiter //

create function rand_creator()
returns varchar(20)
begin
declare return_str varchar(20) default 'aronhe';
declare n int default 0;
set n = floor(rand()*10);
case n
when 0 then set return_str = 'aronhe';
when 1 then set return_str = 'eeelin';
when 2 then set return_str = 'shadowyang';
when 3 then set return_str = 'luzhao';
when 4 then set return_str = 'tommyzhang';
when 5 then set return_str = 'pillarzou';
when 6 then set return_str = 'allenpan';
when 7 then set return_str = 'beyondli';
when 8 then set return_str = 'minshi';
when 9 then set return_str = 'bingchen';
else set return_str = 'joyhu';
end case;
return return_str;
end//

create function rand_num()
returns int
begin
declare n int default 0;
set n = floor(rand()*100);
return n;
end//

create function rand_value()
returns varchar(10)
begin
declare return_str varchar(10) default 'false';
declare n int default 0;
set n = floor(rand()*10);
case
when n<5 then set return_str = 'false';
when n>5 then set return_str = 'true';
else set return_str = 'true';
end case;
return return_str;
end//

create function rand_name()
returns varchar(20)
begin
declare return_str varchar(20) default '';
set return_str = concat('attr',floor(rand()*200));
return return_str;
end//

create procedure insert_devattr(in start int,in max int)
begin
declare i int default 0;
repeat
set i=i+1;
insert into deviceattr values(rand_num(),rand_name(),rand_value());
until i =max
end repeat;
end//

create procedure insert_dev(in start int,in max int)
begin
declare i int default 10;
repeat
set i=i+1;
insert into device values(i,concat('runner',floor(rand()*100)),'pc',floor(rand()*2),'PCQQ',rand_creator());
until i =max
end repeat;
end//

call insert_devattr(0,4000)//
call insert_dev(11,100)//

相关推荐

基于Discuz的Mysql云数据库搬迁实例解析

MySQL数据库的高可用性分析

MySQL数据库设计总结

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
mysql 插入1000w条数据
-- 创建1kw 数据量的数据库 create database bigData; -- 部门表 DROP TABLE IF EXISTS `dept`; CREATE TABLE `dept` ( `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '部门id', `deptno` mediumint(9) NOT NULL DEFAULT '0' COMMENT '部门编号', `dname` varchar(20) NOT NULL DEFAUL
用户5927264
2019/07/31
1.8K0
mysql 插入1000w条数据
谁说MySQL单表行数不要超过2000W?
网上看了一篇文章《为什么说MySQL单表行数不要超过2000w》,亲自实践了一下,跟原作者有不同的结论。原文的结论是2000W左右性能会成指数级的下降,而我的结论是:随着数据量成倍地增加,查询的时间也刚好是成倍增加,是成正比的。
用户10002156
2023/08/07
5090
谁说MySQL单表行数不要超过2000W?
同事乱用分页 MySQL 卡爆,我真是醉了...
突然电话响了起来,一看是我们的一个开发同学,顿时紧张了起来,本周的版本已经发布过了,这时候打电话一般来说是线上出问题了。
Java旅途
2022/03/04
4120
同事乱用分页 MySQL 卡爆,我真是醉了...
一次深夜优化MySQL亿级数据分页的奇妙经历
1月22号晚上10点半,下班后愉快的坐在在回家的地铁上,心里想着周末的生活怎么安排。
程序员小强
2021/07/06
5980
一次深夜优化MySQL亿级数据分页的奇妙经历
MySQL批量插入测试数据的几种方式
在开发过程中我们不管是用来测试性能还是在生产环境中页面展示好看一点, 又或者学习验证某一知识点经常需要一些测试数据, 这个时候如果手敲的话, 十行二十行还好, 多了就很死亡了, 接下来介绍两种常用的MySQL测试数据批量生成方式
终有救赎
2023/12/14
6390
MySQL批量插入测试数据的几种方式
Mysql--批量插入数据脚本
批量插入数据脚本 前置知识 创建一个随机产生字符串的函数rand_string(int); 创建一个随机产生一个数字的函数rand_num() 创建存储过程 调用存储过程 ---- 前置知识 CEILING 函数返回大于或等于所给数字表达式的最小整数。FLOOR 函数返回小于或等于所给数字表达式的最大整数 FLOOR 和 CEILING 返回值的数据类型都与输入的数字表达式的数据类型相同。 select rand(),可以看到结果会是类似于这样的随机小数:0.36361513486289558, s
大忽悠爱学习
2021/11/15
3.1K0
一次深夜优化 MySQL 亿级数据分页的奇妙经历!
突然电话响了起来,一看是我们的一个开发同学,顿时紧张了起来,本周的版本已经发布过了,这时候打电话一般来说是线上出问题了。
终码一生
2022/04/14
3590
一次深夜优化 MySQL 亿级数据分页的奇妙经历!
MySQL如何快速生成千万数据量?
在我们平时工作或学习的过程中,有时需要在数据库中生成大量的测试数据,这个时候,我们可以利用mysql内存表插入速度快的特点,先利用函数和存储过程在内存表中生成数据,然后再从内存表插入普通表中。经过我的测试,这种方案插入数据是非常快的。
公众号 IT老哥
2020/09/16
3.9K0
MySQL如何快速生成千万数据量?
Mysql Limit 调优
建表与插入数据 SQL对比 基本数据 创建表 CREATE TABLE student ( id int(10) NOT NULL AUTO_INCREMENT, name varchar(25) DEFAULT NULL, age tinyint(2) DEFAULT NULL, live varchar(255) DEFAULT NULL, PRIMARY KEY (id) ) ; 批量插入1百万条数据 DROP PROCEDURE IF EXISTS insert_Stu
tanoak
2019/04/18
1.7K0
Mysql Limit 调优
MySQL索引实战附带存储过程
索引虽然是个可以提高查询效率的好东西,但是吗世间万物自然有好有坏,索引有索引的好处,自然就会有其不完美的地方,建立索引之后,MySQL除了维护数据文件之外自然又多了一份维护索引文件的任务,如果数据频繁的变动,维护两份索引文件的MySQL自然是有些招架不住。反馈的效率自然就会慢于没有索引的时候,索引文件自然是要有它落盘的地方,所以就要占用空间喽,虽然硬盘不贵但是这些都是要加进项目的预算哦。所以我们就要了解一下索引的特性才能有效地趋利避坏。
姜同学
2022/10/27
7000
MySQL索引实战附带存储过程
MYSQL学习笔记——sql语句优化工具
一、定位慢查询                                                                                
Java架构师必看
2022/02/27
8920
MYSQLg高级------批量插入百万级数据量
上面的作用就是为了下的 $$ (函数;的表达式)更好的执行;重启或者重新连接即可恢复默认
默 语
2024/11/20
410
MYSQLg高级------批量插入百万级数据量
MySQL函数&存储过程
上一篇文章中说到了定位慢sql,拿到了慢sql后,我们要怎么重现问题呢?那么就需要造数据。函数和存储过程就可以帮助我们造大量的数据,用来重现生产环境的问题。
贪挽懒月
2021/06/02
2.7K0
MySQL函数&存储过程
Mysql存储过程代码例子
--定义一个新的命令结束符号,默认的是以;为结束标记 --同样的可以通过delimiter ;再设置;为结束标记 delimiter $$ --删除函数rand_string drop function rand_string $$ --创建函数rand_string(n):随机产生n个字符组成的字符串 create function rand_string(n INT) returns varchar(255) begin declare chars_str varchar(100)default 'a
用户8983410
2021/11/01
7190
Mysql进阶优化篇01——四万字详解数据库性能分析工具(深入、全面、详细,收藏备用)
数据库的优化整个流程划分成了 观察(Show status) 和 行动(Action) 两个部分。数据库的优化可以总结为下图。字母 S 的部分代表观察(会使用相应的分析工具),字母 A 代表的部分是行动(对应分析可以采取的行动)。
半旧518
2022/10/26
1.1K0
Mysql进阶优化篇01——四万字详解数据库性能分析工具(深入、全面、详细,收藏备用)
7种SQL走索引or不走索引的优化,你竟然还不了解?
在传统的系统应用程序中我们通常都会和数据库建立连接进行数据的读写操作,为了减少连接数据库造成的资源消耗于是有了数据库连接缓冲池。在此基础上,SQL 语句的优化对于研发人员也是非常重要的,高效的 SQL 语句经常会给使一个业务逻辑的接口响应速度变得非常快。所以本篇小编将主要从 SQL 语句的优化给出一些建议以及如何使用 SQL 语句里面的关键字等才能使 SQL 的执行效率相对提升,并且分享一份MySQL优化学习笔记,希望给研发人员在编写 SQL 语句时能有一些帮助。
Java程序猿
2021/06/01
7.6K1
[MySQL学习笔记]1. MySQL测试数据的构造
最后select rand_string(5);为测试是否能够胜场随机的五位长度的字符串
bsbforever
2020/08/18
8710
[MySQL学习笔记]1. MySQL测试数据的构造
索引的创建与设计原则(2)(适合创建索引情况 )
 由于开启过慢查询日志bin-log, 我们就必须为我们的function指定一个参数。 主从复制,主机会将写操作记录在bin-log日志中。从机读取bin-log日志,执行语句来同步数据。如果使 用函数来操作数据,会导致从机和主键操作时间不一致。所以,默认情况下,mysql不开启创建函数设 置。
一个风轻云淡
2022/11/15
3880
索引的创建与设计原则(2)(适合创建索引情况 )
mysql数据库批量插百万数据_sql数据库怎样批量添加数据
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
全栈程序员站长
2022/11/10
3.5K0
MySQL存储过程,视图,用户管理
一张虚拟表,就是将一个经常被使用的查询作为一个虚拟表,开发者查询的时候不需要再次书写SQL,而是直接调用对应的视图就可,调用视图以后MySQL会执行这个查询SQL。
石的三次方
2021/01/05
9730
推荐阅读
相关推荐
mysql 插入1000w条数据
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验