explain实验数据准备
Mysql-Explain(一):explain简介和输出列解释
Mysql-Explain(二):explain实验数据准备
Mysql-Explain(三):输出列-id
Mysql-Explain(四):输出列-select_type
Mysql-Explain(五):输出列-type
Mysql-Explain(六):输出列-possiable_keys、key、key_len
Mysql-Explain(七):输出列-ref、rows
Mysql-Explain(八):输出列-extra
上一篇博客简单介绍了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行记录
三张表暂时都还不创建索引,这等到后续实验的时候再陆续创建。
有了实验的表和数据后,那就可以执行后面的实验啦。