韓順平 Mysql數據庫優化(三) 慢查詢

第 3 章如何定位慢查詢

使用 showstatus 可以參考到mysql的各個參數,我們需要掌握的是以下參數, 其它請參考手冊.

3.1 com_xxx

比如 com_select com_update com_insert com_delete , 比如我們在選擇表究竟時候用MyISAM 還是 InnoDB , 可以看看該網站是以讀和寫操作爲主,則可以使用MyISAM.

這裏注意當我們使用 showstatus 來查詢參數時,默認是當前會話.

show session status like xxxx

如果你要查看從數據庫啓動到現在狀態

show global status like xxx

3.2 Connections

show status like ‘connections’  可以查看當前連接的數量.

3.3 UPtime

表示數據庫啓動時間

3.4 Slow_queries

show status like ‘slow_queries’

顯示慢查詢次數, 默認情況下mysql認爲慢查詢時間是10s


3.5構建一個海量表

我們使用兩個方法,蠕蟲複製,可以構建大表,但是測試效果不好.

使用存儲過程來創建海量表


模擬一個僱員管理系統

#模擬一個僱員管理系統

CREATE 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僱員

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 NULLDEFAULT 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 $$


#創建一個函數,可以返回一個隨機的字符串


create function rand_string(n INT)

returns varchar(255) #該函數會返回一個字符串

begin

#定義了一個變量 chars_str類型 varchar(100)

#默認給 chars_str 初始值  '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 $$


#這裏我們又自定了一個函數,返回一個隨機的部門號

create function rand_num( )

returns int(5)

begin

declare i int default 0;

set i = floor(10+rand()*500);

return i;

 end $$


#隨即添加僱員[光標]  400w,Mysql開發中,可以在存儲過程中調用你自己

#編寫的函數

create procedure insert_emp(in start int(10),in max_num int(10))

begin

declare i int default 0;

#set autocommit =0 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 $$


調用存儲過程添加400w數據

call insert_emp(100001,4000000);


3.6如何把慢查詢記錄到日誌文件中

步驟

在默認情況下,mysql是不會記錄慢查詢, 所以我們要使用另外一種方式啓動mysql,指令: cmd>bin\mysqld.exe – safe-mode –slow-query-log

這樣就會在mysql data目錄,生成一個日誌文件,該文件可以把慢查詢語句記錄到文件.

爲了測試我們修改默認的慢查詢時間

show variables  like ‘long_query_time’  【查詢當前慢查詢時間】

set long_query_time=1

當執行一個時間超過1秒的sql語句,就會被記錄下來.

# Query_time: 1.500000  Lock_time: 0.000000 Rows_sent: 1  Rows_examined: 4000000

use temp100;

SET timestamp=1371870578;

select * from emp whereempno=456784;

分析慢查詢時如何導致explain 工具

基本語法: explain  sql \G

可以來分析mysql是如何執行你的sql語句

細緻的說明請參考優化.ppt

解決問題: 我們發現目前這個語句沒有使用到索引,因此我們先考慮使用索引解決.

創建普通索引: CREATE INDEX 索引名 ON 表名()


看看此時速度怎樣


3.7索引的工作原理

:


3.8補充知識點

當一個表的存儲引擎是MyISAM 時,對應三個文件

表名.frm 【表的結構】

表名.myd 【表的數據】

表名.myi  【索引的數據】

   點擊觀看本章節視頻講解: http://www.tudou.com/programs/view/GEmdvfAhGvU/

   未完待續...




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