MySql教程

MySql优化系列-基础版造数据(存储过程+函数)-1

本文主要是介绍MySql优化系列-基础版造数据(存储过程+函数)-1,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

文章目录

    • MySql优化系列-优化版造数据(存储过程+函数+修改存储引擎)-2
      • 第1步:创建表结构
      • 第2步:生成随机字符串函数
      • 第3步定义存储过程
      • 第4步:调用存储过程
      • 第5步:验证造数据成功
    • 思考
    • 参考

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最小的一条作为唯一数据
这篇关于MySql优化系列-基础版造数据(存储过程+函数)-1的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!