Mysql8性能测试

本文涉及的产品
云数据库 RDS MySQL Serverless,0.5-2RCU 50GB
简介: 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
相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
25天前
Mybatis+mysql动态分页查询数据案例——测试类HouseDaoMybatisImplTest)
Mybatis+mysql动态分页查询数据案例——测试类HouseDaoMybatisImplTest)
20 1
|
25天前
|
Java 关系型数据库 数据库连接
Mybatis+MySQL动态分页查询数据经典案例(含代码以及测试)
Mybatis+MySQL动态分页查询数据经典案例(含代码以及测试)
24 1
|
1月前
|
监控 关系型数据库 MySQL
Flink CDC产品常见问题之使用3.0测试mysql到starrocks启动报错如何解决
Flink CDC(Change Data Capture)是一个基于Apache Flink的实时数据变更捕获库,用于实现数据库的实时同步和变更流的处理;在本汇总中,我们组织了关于Flink CDC产品在实践中用户经常提出的问题及其解答,目的是辅助用户更好地理解和应用这一技术,优化实时数据处理流程。
|
2月前
|
关系型数据库 MySQL Java
Mysql专栏 - 线上调优与压力测试
Mysql专栏 - 线上调优与压力测试
85 0
|
4月前
|
关系型数据库 MySQL Shell
MySQL【实践 01】Linux 环境 MySQL 数据库备份 shell 脚本(脚本源码及说明+定时任务配置+数据库恢复测试)粘贴可以
MySQL【实践 01】Linux 环境 MySQL 数据库备份 shell 脚本(脚本源码及说明+定时任务配置+数据库恢复测试)粘贴可以
50 0
|
4月前
|
存储 关系型数据库 MySQL
MySQL批量插入测试数据的几种方式
MySQL批量插入测试数据的几种方式
61 0
MySQL批量插入测试数据的几种方式
|
5月前
|
关系型数据库 MySQL 测试技术
软件测试|MySQL BETWEEN AND:范围查询详解
软件测试|MySQL BETWEEN AND:范围查询详解
221 0
|
5月前
|
关系型数据库 MySQL 测试技术
软件测试|MySQL LIKE:深入了解模糊查询
软件测试|MySQL LIKE:深入了解模糊查询
41 0
|
5月前
|
关系型数据库 MySQL 测试技术
软件测试|MySQL WHERE条件查询详解:筛选出需要的数据
软件测试|MySQL WHERE条件查询详解:筛选出需要的数据
33 0
|
5月前
|
关系型数据库 MySQL 测试技术
软件测试|MySQL ORDER BY详解:排序查询的利器
软件测试|MySQL ORDER BY详解:排序查询的利器
197 0