天天看點

Mysql8性能測試伺服器配置建立test1資料庫解決報錯插入年級、班級資料編寫存儲過程(向學生表插入指定數量的測試資料)編寫查詢sql(查詢所有年級各班的學生總人數、男女生總人數、最大/最小/平均年齡、各科的最大/最小/平均分數)插入10萬條學生表測試資料,進行測試插入100萬條學生表測試資料,進行測試插入1000萬條學生表測試資料,進行測試插入1億條學生表測試資料,進行測試測試結論

伺服器配置

Mysql8性能測試伺服器配置建立test1資料庫解決報錯插入年級、班級資料編寫存儲過程(向學生表插入指定數量的測試資料)編寫查詢sql(查詢所有年級各班的學生總人數、男女生總人數、最大/最小/平均年齡、各科的最大/最小/平均分數)插入10萬條學生表測試資料,進行測試插入100萬條學生表測試資料,進行測試插入1000萬條學生表測試資料,進行測試插入1億條學生表測試資料,進行測試測試結論

建立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             

最終修改結果如下圖:

Mysql8性能測試伺服器配置建立test1資料庫解決報錯插入年級、班級資料編寫存儲過程(向學生表插入指定數量的測試資料)編寫查詢sql(查詢所有年級各班的學生總人數、男女生總人數、最大/最小/平均年齡、各科的最大/最小/平均分數)插入10萬條學生表測試資料,進行測試插入100萬條學生表測試資料,進行測試插入1000萬條學生表測試資料,進行測試插入1億條學生表測試資料,進行測試測試結論

插入年級、班級資料

1.    insert into grade values(replace(UUID(),'-',''),'1年級');  
2.    insert into grade values(replace(UUID(),'-',''),'2年級');  
3.    insert into grade values(replace(UUID(),'-',''),'3年級');            
Mysql8性能測試伺服器配置建立test1資料庫解決報錯插入年級、班級資料編寫存儲過程(向學生表插入指定數量的測試資料)編寫查詢sql(查詢所有年級各班的學生總人數、男女生總人數、最大/最小/平均年齡、各科的最大/最小/平均分數)插入10萬條學生表測試資料,進行測試插入100萬條學生表測試資料,進行測試插入1000萬條學生表測試資料,進行測試插入1億條學生表測試資料,進行測試測試結論
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');            

結果如下:

Mysql8性能測試伺服器配置建立test1資料庫解決報錯插入年級、班級資料編寫存儲過程(向學生表插入指定數量的測試資料)編寫查詢sql(查詢所有年級各班的學生總人數、男女生總人數、最大/最小/平均年齡、各科的最大/最小/平均分數)插入10萬條學生表測試資料,進行測試插入100萬條學生表測試資料,進行測試插入1000萬條學生表測試資料,進行測試插入1億條學生表測試資料,進行測試測試結論

編寫存儲過程(向學生表插入指定數量的測試資料)

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

Mysql8性能測試伺服器配置建立test1資料庫解決報錯插入年級、班級資料編寫存儲過程(向學生表插入指定數量的測試資料)編寫查詢sql(查詢所有年級各班的學生總人數、男女生總人數、最大/最小/平均年齡、各科的最大/最小/平均分數)插入10萬條學生表測試資料,進行測試插入100萬條學生表測試資料,進行測試插入1000萬條學生表測試資料,進行測試插入1億條學生表測試資料,進行測試測試結論

插入100萬條學生表測試資料,進行測試

1.    #調用存儲過程,向學生表插入100萬條資料  
2.    call test_insert_rows(1000000);             

測試結果:13.803s

Mysql8性能測試伺服器配置建立test1資料庫解決報錯插入年級、班級資料編寫存儲過程(向學生表插入指定數量的測試資料)編寫查詢sql(查詢所有年級各班的學生總人數、男女生總人數、最大/最小/平均年齡、各科的最大/最小/平均分數)插入10萬條學生表測試資料,進行測試插入100萬條學生表測試資料,進行測試插入1000萬條學生表測試資料,進行測試插入1億條學生表測試資料,進行測試測試結論

插入1000萬條學生表測試資料,進行測試

1.    #調用存儲過程,向學生表插入1000萬條資料  
2.    call test_insert_rows(10000000);  
           

測試結果: 198.747s,将虛拟配置調整為2顆cpu 8核+4G記憶體後,測試結果幾乎沒有變化。調整前和調整後,檢視虛拟機資源使用情況基本相同,cpu占用95%左右,記憶體13%左右。

Mysql8性能測試伺服器配置建立test1資料庫解決報錯插入年級、班級資料編寫存儲過程(向學生表插入指定數量的測試資料)編寫查詢sql(查詢所有年級各班的學生總人數、男女生總人數、最大/最小/平均年齡、各科的最大/最小/平均分數)插入10萬條學生表測試資料,進行測試插入100萬條學生表測試資料,進行測試插入1000萬條學生表測試資料,進行測試插入1億條學生表測試資料,進行測試測試結論

插入1億條學生表測試資料,進行測試

Mysql8性能測試伺服器配置建立test1資料庫解決報錯插入年級、班級資料編寫存儲過程(向學生表插入指定數量的測試資料)編寫查詢sql(查詢所有年級各班的學生總人數、男女生總人數、最大/最小/平均年齡、各科的最大/最小/平均分數)插入10萬條學生表測試資料,進行測試插入100萬條學生表測試資料,進行測試插入1000萬條學生表測試資料,進行測試插入1億條學生表測試資料,進行測試測試結論
1.    #調用存儲過程,向學生表插入1億條資料  
2.    call test_insert_rows(100000000);  
           

測試結果: 3536.844s,59分鐘

Mysql8性能測試伺服器配置建立test1資料庫解決報錯插入年級、班級資料編寫存儲過程(向學生表插入指定數量的測試資料)編寫查詢sql(查詢所有年級各班的學生總人數、男女生總人數、最大/最小/平均年齡、各科的最大/最小/平均分數)插入10萬條學生表測試資料,進行測試插入100萬條學生表測試資料,進行測試插入1000萬條學生表測試資料,進行測試插入1億條學生表測試資料,進行測試測試結論

測試結論

在目前伺服器配置情況下,測試結果:

資料量 10萬 100萬 1000萬 1億
結果 0.981s 13.803s 198.747s 3536.844s