前言
- 最近买了一个阿里云RDS实例,瞅着怎么去压榨一下它的性能,就想着直接导入几百上千万的数据量,然后去做一些测试、看下sql的查询性能、以及如何去优化;
- 正好马上要离职准备下一份工作了,也趁此机会复习一下mysql相关知识;目前在保险工作做后天,那表设计是真的复杂,都是百千万级别,每个表都是二三十个字段起步的;
- 关于mysql相关的好多总结知识,后续再慢慢发出来:存储引擎、底层索引数据结构、锁、事务等等
看下本小节要掌握的知识点

下面准备开搞、先创建测试表结构
CREATE TABLE `user_operation_log` (`id` int(11) NOT NULL AUTO\_INCREMENT,`user_id` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4\_general\_ci NULL DEFAULT NULL,`ip` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4\_general\_ci NULL DEFAULT NULL,`op_data` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4\_general\_ci NULL DEFAULT NULL,`attr1` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4\_general\_ci NULL DEFAULT NULL,`attr2` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4\_general\_ci NULL DEFAULT NULL,`attr3` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4\_general\_ci NULL DEFAULT NULL,`attr4` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4\_general\_ci NULL DEFAULT NULL,`attr5` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4\_general\_ci NULL DEFAULT NULL,`attr6` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4\_general\_ci NULL DEFAULT NULL,`attr7` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4\_general\_ci NULL DEFAULT NULL,`attr8` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4\_general\_ci NULL DEFAULT NULL,`attr9` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4\_general\_ci NULL DEFAULT NULL,`attr10` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4\_general\_ci NULL DEFAULT NULL,`attr11` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4\_general\_ci NULL DEFAULT NULL,`attr12` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4\_general\_ci NULL DEFAULT NULL,PRIMARY KEY (`id`) USING BTREE) ENGINE = InnoDB AUTO\_INCREMENT = 1 CHARACTER SET = utf8mb4 COLLATE = utf8mb4\_general\_ci ROW\_FORMAT = Dynamic;
然后通过存储过程批量导入测试数据
DELIMITER ;;CREATE PROCEDURE batch\_insert\_log()BEGINDECLARE i INT DEFAULT 1;DECLARE userId INT DEFAULT 10000000;set @execSql = 'INSERT INTO `user_operation_log`(`user_id`, `ip`, `op_data`, `attr1`, `attr2`, `attr3`, `attr4`, `attr5`, `attr6`, `attr7`, `attr8`, `attr9`, `attr10`, `attr11`, `attr12`) VALUES';set @execData = '';WHILE i<=10000000 DOset @attr = "'测试很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长的属性'";set @execData = concat(@execData, "(", userId + i, ", '10.0.69.175', '用户登录操作'", ",", @attr, ",", @attr, ",", @attr, ",", @attr, ",", @attr, ",", @attr, ",", @attr, ",", @attr, ",", @attr, ",", @attr, ",", @attr, ",", @attr, ")");if i % 1000 = 0thenset @stmtSql = concat(@execSql, @execData,";");prepare stmt from @stmtSql;execute stmt;DEALLOCATE prepare stmt;commit;set @execData = "";elseset @execData = concat(@execData, ",");end if;SET i=i+1;END WHILE;END;;DELIMITER ;
测试正式开始:使用explain调试索引类型
explain select * from user_operation_log a where a.ip = '10.131.11';explain select id from user_operation_log a where a.ip = '10.131.11'; explain select * from user_operation_log a where id = 100;explain select * from user_operation_log a where id is null;explain select * from user_operation_log a where user_id = '100'; explain select * from user_operation_log a where id > 100 and id <200;explain select id,user_id from user_operation_log a where user_id = '4000100'; explain select * from user_operation_log a where id = 200 or user_id = '100';
拓展一个点!千万数据分页查询性能如何优化?
Procedure executed successfully时间: 5262.607sSELECT file_name, concat(TOTAL_EXTENTS,'M') as 'FIle_size' FROM INFORMATION_SCHEMA.FILES order by TOTAL_EXTENTS DESCdelete from user_operation_log a where a.id > 5000000;SELECT * FROM `user_operation_log` LIMIT 10000, 10 SELECT * FROM `user_operation_log` LIMIT 10000, 100SELECT * FROM `user_operation_log` LIMIT 10000, 1000 SELECT * FROM `user_operation_log` LIMIT 10000, 10000 SELECT * FROM `user_operation_log` LIMIT 10000, 100000 SELECT * FROM `user_operation_log` LIMIT 10000, 1000000 SELECT * FROM `user_operation_log` LIMIT 100, 100; SELECT * FROM `user_operation_log` LIMIT 1000, 100; SELECT * FROM `user_operation_log` LIMIT 10000, 100; SELECT * FROM `user_operation_log` LIMIT 100000, 100; SELECT * FROM `user_operation_log` LIMIT 1000000, 100; SELECT user_id FROM `user_operation_log` LIMIT 1000000, 100; SELECT * FROM `user_operation_log` WHERE id >= (SELECT id FROM `user_operation_log` LIMIT 1000000, 1) LIMIT 10