Mysql-Explain(二):explain实验数据准备

上一篇博客简单介绍了explain的作用,并且通过表格的形式罗列出了所有explain输出列的相关信息。不过如果仅仅看文字可能还是难以理解其中的含义,更何况本人文笔羞涩,还可能会存在言不达意的情况,所以还是通过实验来一一解读较好。

实验所需要的表格一共有三张:student、school、major,表结构如下

  • stuednt:学生
  • school:学校
  • major:专业

通过sql脚本来创建表和插入实验数据

  • Sql脚本执行之前先修改log_bin_trust_function_creators的值,这是因为脚本包含函数和过程的创建。

    mysql> show variables like "log_bin_trust_function_creators";
    +---------------------------------+-------+
    | Variable_name                   | Value |
    +---------------------------------+-------+
    | log_bin_trust_function_creators | OFF   |
    +---------------------------------+-------+
    1 row in set, 1 warning (0.00 sec)
    

    如果是OFF或者0,则需要通过下面的语句修改,等后面的sql脚本执行完后,可以再考虑修改回原来的值。

    -- -----------
    -- 0=OFF  1=ON
    -- -----------
    set global log_bin_trust_function_creators = 1;
    
  • 导入sql脚本

    -- ----------------------------
    -- 整个过程执行可能要几分钟的时间
    -- ----------------------------
    SET NAMES utf8mb4;
    SET FOREIGN_KEY_CHECKS = 0;
    
    -- ----------------------------
    -- Table structure for major
    -- ----------------------------
    DROP TABLE IF EXISTS `major`;
    CREATE TABLE `major`  (
      `id` int(11) NOT NULL,
      `name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,
      PRIMARY KEY (`id`) USING BTREE
    ) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic;
    
    -- ----------------------------
    -- Table structure for school
    -- ----------------------------
    DROP TABLE IF EXISTS `school`;
    CREATE TABLE `school`  (
      `id` int(11) NOT NULL,
      `name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,
      PRIMARY KEY (`id`) USING BTREE
    ) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic;
    
    -- ----------------------------
    -- Table structure for student
    -- ----------------------------
    DROP TABLE IF EXISTS `student`;
    CREATE TABLE `student`  (
      `id` int(11) NOT NULL,
      `name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,
      `age` int(11) NULL DEFAULT NULL,
      `school_id` int(11) NULL DEFAULT NULL,
      `major_id` int(11) NULL DEFAULT NULL,
      PRIMARY KEY (`id`) USING BTREE
    ) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic;
    
    -- ----------------------------
    -- Procedure structure for insert_majors
    -- ----------------------------
    DROP PROCEDURE IF EXISTS `insert_majors`;
    delimiter ;;
    CREATE PROCEDURE `insert_majors`(num int)
    BEGIN
    	DECLARE i INT DEFAULT 0;
    	DECLARE EXIT HANDLER FOR SQLEXCEPTION BEGIN ROLLBACK; SELECT -1; END;
    	START TRANSACTION;
    	REPEAT
    		SET i = i + 1;
    		INSERT INTO major VALUES(i,CONCAT('专业',i));
    	UNTIL i = num END REPEAT;
    	COMMIT;
    END
    ;;
    delimiter ;
    
    -- ----------------------------
    -- Procedure structure for insert_schools
    -- ----------------------------
    DROP PROCEDURE IF EXISTS `insert_schools`;
    delimiter ;;
    CREATE PROCEDURE `insert_schools`(num int)
    BEGIN
    	DECLARE i INT DEFAULT 0;
    	DECLARE EXIT HANDLER FOR SQLEXCEPTION BEGIN ROLLBACK; SELECT -1; END;
    	START TRANSACTION;
    	REPEAT
    		SET i = i + 1;
    		INSERT INTO school VALUES(i,CONCAT('学校',i));
    	UNTIL i = num END REPEAT;
    	COMMIT;
    END
    ;;
    delimiter ;
    
    -- ----------------------------
    -- Procedure structure for insert_students
    -- ----------------------------
    DROP PROCEDURE IF EXISTS `insert_students`;
    delimiter ;;
    CREATE PROCEDURE `insert_students`(start int,num int)
    BEGIN
    DECLARE i INT DEFAULT 0;
    DECLARE EXIT HANDLER FOR SQLEXCEPTION BEGIN ROLLBACK; SELECT -1; END;
     
      START TRANSACTION;
    	REPEAT
    	set i = i + 1;
    	insert into student values(start + i,rand_str(10),FLOOR(20 + RAND() * 10),FLOOR(RAND() * 1000),FLOOR(RAND() * 500));
      UNTIL i = num END REPEAT;
    	COMMIT;
    	SELECT 1;
     END
    ;;
    delimiter ;
    
    DROP PROCEDURE IF EXISTS `insert_students2`;
    delimiter ;;
    CREATE PROCEDURE `insert_students2`(batch int,num int)
    BEGIN
    DECLARE i INT DEFAULT 0;
    DECLARE EXIT HANDLER FOR SQLEXCEPTION BEGIN SELECT i; END;
     
      START TRANSACTION;
    	REPEAT
    	set i = i + 1;
    	call insert_students((i-1) * num ,num);
      UNTIL i = batch END REPEAT;
    	COMMIT;
    	SELECT i;
     END
    ;;
    delimiter ;
    
    -- ----------------------------
    -- Function structure for rand_str
    -- ----------------------------
    DROP FUNCTION IF EXISTS `rand_str`;
    delimiter ;;
    CREATE FUNCTION `rand_str`(n int)
     RETURNS varchar(255) CHARSET utf8mb4 COLLATE utf8mb4_general_ci
    BEGIN
    	DECLARE char_str VARCHAR(100) DEFAULT 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
    	DECLARE return_str VARCHAR(255) DEFAULT '';
    	DECLARE i INT DEFAULT 0;
    	WHILE i < n DO
    		SET return_str = CONCAT(return_str,SUBSTRING(char_str,FLOOR(1+RAND() * 52),1));
    		SET i = i + 1;
    	END WHILE;
    	RETURN return_str;
    END
    ;;
    delimiter ;
    
    -- 如果要改变插入表的数据行数,可以修改这里的参数
    call insert_schools(1000);
    call insert_majors(500);
    -- 第一个参数分20批次插入,第二个参数每个批次插入100000,所以一共是200w条记录
    call insert_students2(20,100000);
    
    SET FOREIGN_KEY_CHECKS = 1;
    

检查表和数据

  • student:一共插入了200w行记录,由于是实验数据所以学生名称是随机生成的字符串
  • school:一共插入1000行记录

  • major:一共插入500行记录

三张表暂时都还不创建索引,这等到后续实验的时候再陆续创建。

有了实验的表和数据后,那就可以执行后面的实验啦。

猜你喜欢

转载自blog.csdn.net/u012180773/article/details/104138949
今日推荐