昆明营销型网站建设,平面ui设计是学什么,软件开发一个月多少钱,百度投诉电话人工服务总部1.准备工作#xff08;1#xff09;由于是使用存储过程#xff0c;mysql从5.0版开始支持存储过程#xff0c;那么需要mysql的版本在5.0或者以上。如何查看mysql的版本#xff0c;使用下面sql语句查看#xff1a;#xff08;2#xff09;创建两张表#xff0c;表结构一…1.准备工作1由于是使用存储过程mysql从5.0版开始支持存储过程那么需要mysql的版本在5.0或者以上。如何查看mysql的版本使用下面sql语句查看2创建两张表表结构一致但使用的存储引擎不一样如下所示普通表使用mysql5.5版本后默认的INNODB存储引擎内存表使用MEMORY存储引擎。由于MEMORY存储不常用这里简单说一下其特点MEMORY引擎表结构创建在磁盘上数据全部放在内存中访问速度较快但是当MySQL重启后或者一旦系统奔溃的话数据都会消失结构还存在。# 创建普通表
CREATE TABLE user_info (id INT ( 11 ) NOT NULL AUTO_INCREMENT COMMENT ID,name VARCHAR ( 30 ) NOT NULL COMMENT 用户名,phone VARCHAR ( 11 ) NOT NULL COMMENT 手机号,status TINYINT ( 1 ) NULL DEFAULT NULL COMMENT 用户状态:停用0启动1,create_time datetime NOT NULL COMMENT 创建时间,PRIMARY KEY ( id ) USING BTREE
) ENGINE INNODB AUTO_INCREMENT 10001 CHARACTER
SET utf8mb4 COLLATE utf8mb4_general_ci COMMENT 用户信息表;# 创建内存表
CREATE TABLE memory_user_info (id INT ( 11 ) NOT NULL AUTO_INCREMENT COMMENT ID,name VARCHAR ( 30 ) NOT NULL COMMENT 用户名,phone VARCHAR ( 11 ) NOT NULL COMMENT 手机号,status TINYINT ( 1 ) NULL DEFAULT NULL COMMENT 用户状态:停用0启动1,create_time datetime NOT NULL COMMENT 创建时间,PRIMARY KEY ( id ) USING BTREE
) ENGINE MEMORY AUTO_INCREMENT 10001 CHARACTER
SET utf8mb4 COLLATE utf8mb4_general_ci COMMENT 用户信息内存表;2.主要实现步骤1创建自动生成数据的函数插入时使用2创建插入内存表数据存储过程调用已创建好的数据生成函数3创建内存表数据插入普通表存储过程4调用存储过程。5数据查看验证3.创建自动生成数据的函数1生成n个随机数字DELIMITER //
DROP FUNCTION
IFEXISTS randomNum // CREATE FUNCTION randomNum (n INT,chars_str VARCHAR ( 10 )) RETURNS VARCHAR ( 255 ) BEGINDECLAREreturn_str VARCHAR ( 255 ) DEFAULT ;DECLAREi INT DEFAULT 0;WHILEi n DOSET return_str concat(return_str,substring( chars_str, FLOOR( 1 RAND()* 10 ), 1 ));SET i i 1;END WHILE;RETURN return_str;END //
DELIMITER;函数运行截图脚本所用到的mysql函数及其功能如下a.concat()将多个字符串连接成一个字符串。b.Floor()向下取整。c.substring(string, position, length) 第一个参数string指的是需要截取的原字符串。第二个参数position指的是从哪个位置开始截取子字符串这里字符的位置编码序号是从1开始若position为负数则从右往左开始数位置。 第三个参数length指的是需要截取的字符串长度如果不写则默认截取从position开始到最后一位的所有字符。d.RAND()只能生成0到1之间的随机小数。2创建随机生成手机号函数DELIMITER //
DROP FUNCTION
IFEXISTS getPhone // CREATE FUNCTION getPhone () RETURNS VARCHAR ( 11 ) BEGINDECLAREhead CHAR ( 3 );DECLAREphone VARCHAR ( 11 );DECLAREbodys VARCHAR ( 65 ) DEFAULT 130 131 132 133 134 135 136 137 138 139 186 187 189 151 157;DECLARESTARTS INT;SET STARTS 1floor ( rand()* 15 )* 4;SET head trim(substring( bodys, STARTS, 3 ));SET phone trim(concat(head,randomNum ( 8, 0123456789 )));RETURN phone;END //
DELIMITER;函数运行截图3)创建随机生成用户名函数DELIMITER //
DROP FUNCTION
IFEXISTS randName // CREATE FUNCTION randName ( n INT ) RETURNS VARCHAR ( 255 ) CHARSET utf8mb4 DETERMINISTIC BEGINDECLAREchars_str VARCHAR ( 100 ) DEFAULT abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789;DECLAREreturn_str VARCHAR ( 30 ) DEFAULT ;DECLAREi INT DEFAULT 0;WHILEi n DOSET return_str concat(return_str,substring( chars_str, FLOOR( 1 RAND() * 62 ), 1 ));SET i i 1;END WHILE;RETURN return_str;END //
DELIMITER;函数运行截图4随机生成用户状态函数DELIMITER //
DROP FUNCTION
IFEXISTS randStatus // CREATE FUNCTION randStatus ( ) RETURNS TINYINT ( 1 ) BEGINDECLAREuser_status INT ( 1 ) DEFAULT 0;SET user_status IF( FLOOR( RAND() * 10 ) 4, 1, 0 );RETURN user_status;END //
DELIMITER;函数运行截图5查看数据库中所有自定义函数信息4.创建存储过程1创建插入内存表数据存储过程DELIMITER //
DROP PROCEDURE
IFEXISTS add_memory_user_info // CREATE PROCEDURE add_memory_user_info ( IN n INT ) BEGINDECLAREi INT DEFAULT 1;WHILE( i n ) DOINSERT INTO memory_user_info ( name, phone, status, create_time )VALUES(randName ( 20 ),getPhone (),randStatus (),NOW());SET i i 1;END WHILE;END //
DELIMITER;入参n是多少就表示往内存表memory_user_info插入多少条数据存储过程运行截图2创建内存表数据插入普通表存储过程DELIMITER //
DROP PROCEDURE
IFEXISTS add_user_info // CREATE PROCEDURE add_user_info ( IN n INT, IN count INT ) BEGINDECLAREi INT DEFAULT 1;WHILE( i n ) DOCALL add_memory_user_info ( count );INSERT INTO user_info SELECT* FROMmemory_user_info;DELETE FROMmemory_user_info;SET i i 1;END WHILE;END //
DELIMITER; 这是最主要的存储过程也是入口利用对内存表的循环插入和删除来实现批量生成数据不需要更改mysql默认的max_heap_table_size值默认值是16Mmax_heap_table_size 的作用是配置用户创建内存临时表的大小配置的值越大能存进内存表的数据就越多。存储过程运行截图3查看存储过程的状态-- 查看数据库所有的存储过程
SHOW PROCEDURE STATUS;
-- 模糊查询存储过程
SHOW PROCEDURE STATUS LIKE add%;模糊查询结果5.调用存储过程 mysql称存储过程的执行为调用因此mysql执行存储过程的语句为CALL。CALL接受存储过程的名字以及需要传递给它的任意参数。 通过调用add_user_info存储过程不断循环插入内存表memory_user_info再从内存表获取数据插入普通表user_info然后删除内存表数据以此循环直至循环结束。循环100次每次生成10000条数据共生成一百万条数据。CALL add_user_info(100,10000);6.数据查看验证 在普通表数据达到6万条时已经耗时大概在23分钟左右以这个时间推算100万数据生成预计需要6小时左右。耗时的点主要是在四个随机生成字段数据的函数上。如果字段数据不要求随机那么将会快很多。数据记录如下效果