數據庫調優教程(二)慢查詢數據準備

一、           發現慢查詢


上一講我們談論了慢查詢的定義,這一講我們來創建一張大表,爲慢查詢做數據準備。


2.      慢查詢數據準備


要想發現慢查詢,首先要使慢查詢發生。在一張普通數量級的表格中是不能發生慢查詢的,除非你對於慢查詢的定義時一個毫秒。因此我們必須手動創建一張大數量級的表,這裏選擇創建一張40萬數量級的表(同學們也可以創建百萬級的,如果你們的電腦很厲害。但是一般情況下,十萬級的數據就可以看出慢查詢了)。

1)    創建數據庫

[plain] view plaincopy
  1. Create database bigTable default character set GBK;  

2)    創建表

#部門表#


[plain] view plaincopy
  1. CREATE TABLE dept(  
  2. id int unsigned primary key auto_increment,  
  3. deptno MEDIUMINT   UNSIGNED  NOT NULL  DEFAULT 0,   
  4. dname VARCHAR(20)  NOT NULL  DEFAULT "",  
  5. loc VARCHAR(13) NOT NULL DEFAULT ""  
  6. ) ENGINE=INNODB DEFAULT CHARSET=GBK ;  


#僱員表#

[plain] view plaincopy
  1. CREATE TABLE emp  
  2. (  
  3. id int unsigned primary key auto_increment,  
  4. empno  MEDIUMINT UNSIGNED  NOT NULL  DEFAULT 0, /*編號*/  
  5. ename VARCHAR(20) NOT NULL DEFAULT "", /*名字*/  
  6. job VARCHAR(9) NOT NULL DEFAULT "",/*工作*/  
  7. mgr MEDIUMINT UNSIGNED NOT NULL DEFAULT 0,/*上級編號*/  
  8. hiredate DATE NOT NULL,/*入職時間*/  
  9. sal DECIMAL(7,2)  NOT NULL,/*薪水*/  
  10. comm DECIMAL(7,2) NOT NULL,/*紅利*/  
  11. deptno MEDIUMINT UNSIGNED NOT NULL DEFAULT 0 /*部門編號*/  
  12. )ENGINE=INNODB DEFAULT CHARSET=GBK ;  


3)    創建函數

函數用於隨機產生數據,保證每條數據都不同

#函數1 創建#

#創建函數. 用於隨機產生字符串。該函數接收一個整數


[plain] view plaincopy
  1. delimiter $$#定義一個新的命令結束符合  
  2. create function rand_string(n INT)   
  3. returns varchar(255) #該函數會返回一個字符串  
  4. begin   
  5. #chars_str定義一個變量 chars_str,類型是 varchar(100),默認值'abcdefghijklmnopqrstuvwxyzABCDEFJHIJKLMNOPQRSTUVWXYZ';  
  6.  declare chars_str varchar(100) default  
  7.    'abcdefghijklmnopqrstuvwxyzABCDEFJHIJKLMNOPQRSTUVWXYZ';  
  8.  declare return_str varchar(255) default '';  
  9.  declare i int default 0;  
  10.  while i < n do   
  11.    set return_str =concat(return_str,substring(chars_str,floor(1+rand()*52),1));  
  12.    set i = i + 1;  
  13.    end while;  
  14.   return return_str;  
  15.   end $$  


#函數2創建#

#用於隨機產生部門編號

[plain] view plaincopy
  1. create function rand_num( )  
  2. returns int(5)  
  3. begin   
  4.  declare i int default 0;  
  5.  set i = floor(10+rand()*500);  
  6. return i;  
  7.   end $$  


4)    創建存儲過程

 

#存儲過程一#

#該存儲過程用於往emp表中插入大量數據

[plain] view plaincopy
  1. create procedure insert_emp(in start int(10),in max_num int(10))  
  2. begin  
  3. declare i int default 0;   
  4. #set autocommit =0 把autocommit設置成0  
  5.  set autocommit = 0;    
  6.  repeat  
  7.  set i = i + 1;  
  8.  insert into emp (empno, ename ,job ,mgr ,hiredate ,sal ,comm ,deptno ) values ((start+i) ,rand_string(6),'SALESMAN',0001,curdate(),2000,400,rand_num());  
  9.   until i = max_num  
  10.  end repeat;  
  11.    commit;  
  12.  end $$  


執行存儲過程,往emp表添加40萬條數據

[plain] view plaincopy
  1. call insert_emp(100001,400000);  

查詢,發現Emp表插入了40萬條記錄



#存儲過程二#

#往dept表添加隨機數據

[plain] view plaincopy
  1. create procedure insert_dept(in start int(10),in max_num int(10))  
  2. begin  
  3. declare i int default 0;   
  4.  set autocommit = 0;    
  5.  repeat  
  6.  set i = i + 1;  
  7.  insert into dept (deptno ,dname,loc  ) values ((start+i) ,rand_string(10),rand_string(8));  
  8.   until i = max_num  
  9.  end repeat;  
  10.    commit;  
  11.  end $$  


執行存儲過程二

[plain] view plaincopy
  1. delimiter ;  
  2. call insert_dept(100,10);  


至此,數據準備完成。我們創建了大表emp。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章