Mysql8性能测试

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: Mysql8性能测试

服务器配置

1.png

创建test1数据库

1.    CREATE DATABASE IF NOT EXISTS test1 DEFAULT CHARSET utf8 COLLATE utf8_general_ci;  

创建年级、班级、学生表

1.    DROP TABLE IF EXISTS `grade`;  
2.    CREATE TABLE `grade` (  
3.      `id` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '' COMMENT 'id',  
4.      `gradeName` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '班级名称',  
5.      PRIMARY KEY (`id`)  
6.    ) ENGINE=InnoDB DEFAULT CHARSET=utf8; 

1.    DROP TABLE IF EXISTS `class`;  
2.    CREATE TABLE `class` (  
3.      `id` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT 'id',  
4.      `className` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '班级名称',  
5.      `gradeId` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '年级id',  
6.      PRIMARY KEY (`id`)  
7.    ) ENGINE=InnoDB DEFAULT CHARSET=utf8;

1.    DROP TABLE IF EXISTS `student`;  
2.    CREATE TABLE `student` (  
3.      `id` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT 'id',  
4.      `name` varchar(10) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '学生姓名',  
5.      `age` int(2) DEFAULT NULL COMMENT '年龄',  
6.      `gender` int(1) DEFAULT NULL COMMENT '性别,1=男,2=女',  
7.      `classId` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '班级id',  
8.      `gradeId` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '年级id',  
9.      `chineseScore` int(3) DEFAULT NULL COMMENT '语文成绩',  
10.      `englishScore` int(3) DEFAULT NULL COMMENT '英文成绩',  
11.      `mathScore` int(3) DEFAULT NULL COMMENT '数学成绩',  
12.      PRIMARY KEY (`id`)  
13.    ) ENGINE=InnoDB DEFAULT CHARSET=utf8;

解决报错

如执行报如下错(不影响执行结果):
[Err] 1055 - Expression #1 of ORDER BY clause is not in GROUP BY clause and contains nonaggregated column 'information_schema.PROFILING.SEQ' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by

修改 /etc/my.cnf文件,在尾部加入以下内容:

1.    sql_mode='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION'  

重启mysql

1.    Systemctl restart mysqld  

最终修改结果如下图:
2.png

插入年级、班级数据

1.    insert into grade values(replace(UUID(),'-',''),'1年级');  
2.    insert into grade values(replace(UUID(),'-',''),'2年级');  
3.    insert into grade values(replace(UUID(),'-',''),'3年级'); 

3.png

1.    #注意,gradeId以年级表实际值为准  
2.    insert into class values(replace(UUID(),'-',''),'1年级1班','d684baa545fc11ea80e5000c29d5571e');    
3.    insert into class values(replace(UUID(),'-',''),'1年级2班','d684baa545fc11ea80e5000c29d5571e');    
4.    insert into class values(replace(UUID(),'-',''),'1年级3班','d684baa545fc11ea80e5000c29d5571e');    
5.    insert into class values(replace(UUID(),'-',''),'1年级4班','d684baa545fc11ea80e5000c29d5571e');    
6.    insert into class values(replace(UUID(),'-',''),'1年级5班','d684baa545fc11ea80e5000c29d5571e');    
7.    insert into class values(replace(UUID(),'-',''),'2年级1班','d687455e45fc11ea80e5000c29d5571e');    
8.    insert into class values(replace(UUID(),'-',''),'2年级2班','d687455e45fc11ea80e5000c29d5571e');    
9.    insert into class values(replace(UUID(),'-',''),'2年级3班','d687455e45fc11ea80e5000c29d5571e');    
10.    insert into class values(replace(UUID(),'-',''),'2年级4班','d687455e45fc11ea80e5000c29d5571e');    
11.    insert into class values(replace(UUID(),'-',''),'2年级5班','d687455e45fc11ea80e5000c29d5571e');    
12.    insert into class values(replace(UUID(),'-',''),'3年级1班','d6895bc645fc11ea80e5000c29d5571e');    
13.    insert into class values(replace(UUID(),'-',''),'3年级2班','d6895bc645fc11ea80e5000c29d5571e');    
14.    insert into class values(replace(UUID(),'-',''),'3年级3班','d6895bc645fc11ea80e5000c29d5571e');    
15.    insert into class values(replace(UUID(),'-',''),'3年级4班','d6895bc645fc11ea80e5000c29d5571e');    
16.    insert into class values(replace(UUID(),'-',''),'3年级5班','d6895bc645fc11ea80e5000c29d5571e'); 

结果如下:
4.png

编写存储过程(向学生表插入指定数量的测试数据)

1.    DROP PROCEDURE IF EXISTS `test_insert_rows`;  
2.    DELIMITER ;;  
3.    CREATE DEFINER=`root`@`%` PROCEDURE `test_insert_rows`(IN count INT)  
4.    BEGIN  
5.      
6.        DECLARE i int DEFAULT 0;  
7.        DECLARE _id varchar(32);  
8.        DECLARE _name varchar(10);  
9.        DECLARE _gender int(1);  
10.        DECLARE _classId varchar(32);  
11.        DECLARE _gradeId varchar(32);  
12.        DECLARE _chineseScore int(3);  
13.        DECLARE _englishScore int(3);  
14.        DECLARE _mathScore int(3);  
15.        DECLARE _class varchar(10);  
16.        DECLARE _age int(2);  
17.      
18.        while i < count do         
19.              
20.            #随机选择插入的班级  
21.            select concat(floor(rand()*3+1),'年级',floor(rand()*5+1),'班') into _class;  
22.            #id为UUID随机数  
23.            select replace(UUID(),'-','') into _id;  
24.            #姓名为10位随机字符串              
25.            select substr(md5(rand()),1,10) into _name;  
26.            #性别随机选择1或2  
27.            select floor(rand()*2+1) into _gender;  
28.            #随机选择班级和年级  
29.            select id,gradeId into _classId,_gradeId from class where className=_class;  
30.            #语文、英文、数学成绩生成50-100的随机数  
31.            select floor(rand()*(101-50)+50) into _chineseScore;  
32.            select floor(rand()*(101-50)+50) into _englishScore;  
33.            select floor(rand()*(101-50)+50) into _mathScore;  
34.            #年龄生成6-12的随机数  
35.            select floor(rand()*(13-6)+6) into _age;  
36.      
37.            insert into student values(_id,_name,_age,_gender,_classId,_gradeId,_chineseScore,_englishScore,_mathScore);          
38.              
39.            set i = i+1;  
40.      
41.        end while;  
42.          
43.        select 'completed';  
44.      
45.      
46.    END  
47.    ;;  
48.    DELIMITER ; 

编写查询sql(查询所有年级各班的学生总人数、男女生总人数、最大/最小/平均年龄、各科的最大/最小/平均分数)

1.    SELECT  
2.        g.gradeName AS '年级',  
3.        c.className AS '班级',  
4.        count(s.id) AS '总人数',  
5.        min(s.age) AS '最小年龄',  
6.        max(s.age) AS '最大年龄',  
7.        round(avg(s.age), 2) AS '平均年龄',  
8.        (  
9.            SELECT  
10.                count(1)  
11.            FROM  
12.                student  
13.            WHERE  
14.                classId = c.id  
15.            AND gender = 1  
16.        ) AS '男生人数',  
17.        (  
18.            SELECT  
19.                count(1)  
20.            FROM  
21.                student  
22.            WHERE  
23.                classId = c.id  
24.            AND gender = 2  
25.        ) AS '女生人数',  
26.        min(s.chineseScore) AS '语文最低分',  
27.        max(s.chineseScore) AS '语文最高分',  
28.        round(avg(s.chineseScore), 2) AS '语文平均分',  
29.        min(s.englishScore) AS '英语最低分',  
30.        max(s.englishScore) AS '英语最高分',  
31.        round(avg(s.englishScore), 2) AS '英语平均分',  
32.        min(s.mathScore) AS '数学最低分',  
33.        max(s.mathScore) AS '数学最高分',  
34.        round(avg(s.mathScore), 2) AS '数学平均分'  
35.    FROM  
36.        class AS c  
37.    LEFT JOIN student AS s ON s.classId = c.id  
38.    LEFT JOIN grade AS g ON c.gradeId = g.id  
39.    GROUP BY  
40.        s.classId  
41.    ORDER BY  
42.        g.gradeName,  
43.        c.className 

插入10万条学生表测试数据,进行测试

1.    #调用存储过程,向学生表插入10万条数据  
2.    call test_insert_rows(100000);  

测试结果:0.981s
5.png

插入100万条学生表测试数据,进行测试

1.    #调用存储过程,向学生表插入100万条数据  
2.    call test_insert_rows(1000000);  

测试结果:13.803s
6.png

插入1000万条学生表测试数据,进行测试

1.    #调用存储过程,向学生表插入1000万条数据  
2.    call test_insert_rows(10000000);  

测试结果: 198.747s,将虚拟配置调整为2颗cpu 8核+4G内存后,测试结果几乎没有变化。调整前和调整后,查看虚拟机资源使用情况基本相同,cpu占用95%左右,内存13%左右。

7.png

插入1亿条学生表测试数据,进行测试

8.png

1.    #调用存储过程,向学生表插入1亿条数据  
2.    call test_insert_rows(100000000);  

测试结果: 3536.844s,59分钟

9.png

测试结论

在当前服务器配置情况下,测试结果:

数据量 10万 100万 1000万 1亿
结果 0.981s 13.803s 198.747s 3536.844s
相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
26天前
|
Java 关系型数据库 MySQL
自动化测试项目实战笔记(一):JDK、Tomcat、MySQL、Jpress环境安装和搭建
这篇文章是关于自动化测试项目实战笔记,涵盖了JDK、Tomcat、MySQL、Jpress环境的安装和搭建过程,以及测试用例和常见问题总结。
45 1
自动化测试项目实战笔记(一):JDK、Tomcat、MySQL、Jpress环境安装和搭建
|
6月前
|
关系型数据库 MySQL 测试技术
MySQL性能测试(完整版)
MySQL性能测试(完整版)
490 1
|
3月前
|
关系型数据库 MySQL OLTP
性能工具之 MySQL OLTP Sysbench BenchMark 测试示例
【8月更文挑战第6天】使用 pt-query-digest 工具分析 MySQL 慢日志性能工具之 MySQL OLTP Sysbench BenchMark 测试示例
270 0
性能工具之 MySQL OLTP Sysbench BenchMark 测试示例
|
3月前
|
关系型数据库 MySQL 测试技术
使用docker部署MySQL测试环境
使用docker部署MySQL测试环境
42 0
|
4月前
|
数据库
基于PHP+MYSQL开发制作的趣味测试网站源码
基于PHP+MYSQL开发制作的趣味测试网站源码。可在后台提前设置好缘分, 自己手动在数据库里修改数据,数据库里有就会优先查询数据库的信息, 没设置的话第一次查询缘分都是非常好的 95-99,第二次查就比较差 , 所以如果要你女朋友查询你的名字觉得很好 那就得是她第一反应是查和你的缘分, 如果查的是别人,那不好意思,第二个可能是你。
66 3
|
3月前
|
SQL 缓存 关系型数据库
MySQL配置简单优化与读写测试
MySQL配置简单优化与读写测试
|
5月前
|
关系型数据库 MySQL 测试技术
《阿里云产品四月刊》—瑶池数据库微课堂|RDS MySQL 经济版 vs 自建 MySQL 性能压测与性价比分析
阿里云瑶池数据库云原生化和一体化产品能力升级,多款产品更新迭代
|
5月前
|
存储 关系型数据库 MySQL
Baidu Comate Web在线出题能力测试——MySQL出题能力
Baidu Comate Web在线出题能力测试——MySQL出题能力
41 0
|
5月前
|
SQL 关系型数据库 MySQL
MySQL——case when语句测试
MySQL——case when语句测试
56 0
|
5月前
|
SQL 存储 关系型数据库
MySQL存储过程——Baidu Comate智能代码助手添加20条DML语句——测试索引效果
MySQL存储过程——Baidu Comate智能代码助手添加20条DML语句——测试索引效果
41 0