14-mysql优化之使用存储过程向mysql数据库中添加4000000条数据

来源:互联网 发布:只有程序员才懂的笑话 编辑:程序博客网 时间:2024/05/02 07:47

向数据库中插入4000000条数据

①创建dept

#创建表DEPTCREATE TABLE dept( /*部门表*/deptno MEDIUMINT   UNSIGNED  NOT NULL  DEFAULT 0, dname VARCHAR(20)  NOT NULL  DEFAULT "",loc VARCHAR(13) NOT NULL DEFAULT "") ENGINE=MyISAM DEFAULT CHARSET=utf8 ;

②创建表EMP雇员

#创建表EMP雇员CREATE TABLE emp(empno  MEDIUMINT UNSIGNED  NOT NULL  DEFAULT 0, /*编号*/ename VARCHAR(20) NOT NULL DEFAULT "", /*名字*/job VARCHAR(9) NOT NULL DEFAULT "",/*工作*/mgr MEDIUMINT UNSIGNED NOT NULL DEFAULT 0,/*上级编号*/hiredate DATE NOT NULL,/*入职时间*/sal DECIMAL(7,2)  NOT NULL,/*薪水*/comm DECIMAL(7,2) NOT NULL,/*红利*/deptno MEDIUMINT UNSIGNED NOT NULL DEFAULT 0 /*部门编号*/)ENGINE=MyISAM DEFAULT CHARSET=utf8 ;

#工资级别表CREATE TABLE salgrade(grade MEDIUMINT UNSIGNED NOT NULL DEFAULT 0,losal DECIMAL(17,2)  NOT NULL,hisal DECIMAL(17,2)  NOT NULL)ENGINE=MyISAM DEFAULT CHARSET=utf8;

测试数据INSERT INTO salgrade VALUES (1,700,1200);INSERT INTO salgrade VALUES (2,1201,1400);INSERT INTO salgrade VALUES (3,1401,2000);INSERT INTO salgrade VALUES (4,2001,3000);INSERT INTO salgrade VALUES (5,3001,9999);

#定义一个新的命令结束符合delimiter $$

#删除自定的函数drop  function rand_string $$

#这里我创建了一个函数. #rand_string(n INT) rand_string 是函数名 (n INT) //该函数接收一个整数create function rand_string(n INT) returns varchar(255) #该函数会返回一个字符串begin #chars_str定义一个变量 chars_str,类型是 varchar(100),默认值'abcdefghijklmnopqrstuvwxyzABCDEFJHIJKLMNOPQRSTUVWXYZ'; declare chars_str varchar(100) default   'abcdefghijklmnopqrstuvwxyzABCDEFJHIJKLMNOPQRSTUVWXYZ'; declare return_str varchar(255) default ''; declare i int default 0; while i < n do    set return_str =concat(return_str,substring(chars_str,floor(1+rand()*52),1));   set i = i + 1;   end while;  return return_str;  end $$

测试自定义函数

delimiter ;select rand_string(6);

# 随机产生部门编号delimiter $$drop  function rand_num $$

#这里我们又自定了一个函数create function rand_num( )returns int(5)begin  declare i int default 0; set i = floor(10+rand()*500);return i;  end $$

测试

delimiter ;select rand_num();

#******************************************
#向emp表中插入记录(海量的数据)

delimiter $$drop procedure insert_emp $$#随即添加雇员[光标]  400wcreate procedure insert_emp(in start int(10),in max_num int(10))begindeclare i int default 0; #set autocommit =0 把autocommit设置成0 set autocommit = 0;   repeat set i = i + 1; insert into emp values ((start+i) ,rand_string(6),'SALESMAN',0001,curdate(),2000,400,rand_num());  until i = max_num end repeat;   commit; end $$

delimiter ;#调用刚刚写好的函数, 1800000条记录,从100001号开始call insert_emp(100001,4000000);

#**************************************************************
#  向dept表中插入记录

delimiter $$drop procedure insert_dept $$

create procedure insert_dept(in start int(10),in max_num int(10))begindeclare i int default 0;  set autocommit = 0;   repeat set i = i + 1; insert into dept values ((start+i) ,rand_string(10),rand_string(8));  until i = max_num end repeat;   commit; end $$

delimiter ;call insert_dept(100,10);

#------------------------------------------------
#向salgrade 表插入数据

delimiter $$drop procedure insert_salgrade $$create procedure insert_salgrade(in start int(10),in max_num int(10))begindeclare i int default 0;  set autocommit = 0; ALTER TABLE emp DISABLE KEYS;   repeat set i = i + 1; insert into salgrade values ((start+i) ,(start+i),(start+i));  until i = max_num end repeat;   commit; end $$delimiter ;

#测试不需要了#call insert_salgrade(10000,1000000);


向数据库中查询一次,然后再查看slow_queries的值,可以发现,慢查询次数添加了1次。


查询mysql中查询比较慢的sql语句。


0 0
原创粉丝点击