文章目录
MySql优化系列-优化版造数据(存储过程+函数+修改存储引擎)-2
数据作为后端开发的主体,需要对其进行一些列的操作,或增或改或删或查。高效地操作数据是程序的非功能性要求。
优化首先必得有数据,这样才好比对优化前跟优化后的效果,以判断优化是否达到目标。
第1步:创建表结构
-- 创建表
DROP TABLE IF EXISTS crm_user;
CREATE TABLE `crm_user` (
`id` INT(11) NOT NULL AUTO_INCREMENT,
`user_code` VARCHAR(45) NOT NULL COMMENT '用户编码',
`user_name` VARCHAR(45) DEFAULT NULL COMMENT '用户名称',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_user_code` (`user_code`)
) ENGINE=INNODB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 COMMENT='用户表';
第2步:生成随机字符串函数
DELIMITER $$
DROP FUNCTION IF EXISTS rand_str$$
CREATE FUNCTION rand_str(strlen SMALLINT ) RETURNS VARCHAR(255)
BEGIN
DECLARE randStr VARCHAR(255) DEFAULT 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890';
DECLARE i SMALLINT DEFAULT 100;
DECLARE resultStr VARCHAR(255) DEFAULT '';
SET i = IF(strlen > 0,strlen,i);
WHILE i > 0 DO
SET resultStr=CONCAT(SUBSTR(randStr,FLOOR(RAND()*LENGTH(randStr))+1,1),resultStr);
SET i=i-1;
END WHILE;
RETURN resultStr;
END $$
第3步定义存储过程
这里做了一个取巧,即用INSERT INTO IGNORE方式插入,毕竟有唯一索引的约束。当然也可以通过先插入,然后在去重,最后在增加唯一索引的方式。
-- 创建存储过程
DROP PROCEDURE IF EXISTS generateCrmUser;
-- 将语句的结束符号从分号;临时改为两个$$(可以是自定义)
DELIMITER $$
CREATE PROCEDURE generateCrmUser()
BEGIN
DECLARE num INT;
SET num = 1;
SET autocommit=0;
SET unique_checks=0;
WHILE num < 50000 DO
INSERT IGNORE INTO `crm_user_50w` ( user_code, user_name ) VALUES((SELECT rand_str(12) FROM DUAL),(SELECT rand_str(12) FROM DUAL));
SET num = num + 1;
END WHILE;
SET autocommit=1;
SET unique_checks=1;
END$$
DELIMITER ;
第4步:调用存储过程
-- 调用存储过程
CALL generateCrmUser();
第5步:验证造数据成功
-- 查看条数
SELECT COUNT(*) FROM crm_user;
思考
- 能否利用mysql存储引擎的特点来优化这个工程。即MYISAM插入比较快,MEMORY更快,先用其它引擎造数据,然后更改存储引擎为INNODB。
1. 存储引擎用MEMORY内存容易满,只适合造小批量数据(或者在存储过程里面做逻辑)。报错示例如下:
错误代码: 1114
The table 'crm_user_50w' is full
2. 用MYIASM通用性强一些,不过竞争压力不强的情况下,情况不见得有比INNODB快,但是一般来说没有MYISAM没有事务理论上插入要快一些。
参考
- mysql 存储过程演示造数据
- MySQL 查询重复数据,删除重复数据保留id最小的一条作为唯一数据