数据作为后端开发的主体,需要对其进行一些列的操作,或增或改或删或查。高效地操作数据是程序的非功能性要求。
优化首先必得有数据,这样才好比对优化前跟优化后的效果,以判断优化是否达到目标。
-- 创建表 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='用户表';
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 $$
这里做了一个取巧,即用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 ;
-- 调用存储过程 CALL generateCrmUser();
-- 查看条数 SELECT COUNT(*) FROM crm_user;
1. 存储引擎用MEMORY内存容易满,只适合造小批量数据(或者在存储过程里面做逻辑)。报错示例如下: 错误代码: 1114 The table 'crm_user_50w' is full 2. 用MYIASM通用性强一些,不过竞争压力不强的情况下,情况不见得有比INNODB快,但是一般来说没有MYISAM没有事务理论上插入要快一些。