(1) MySQL的慢查詢日誌是MySQL提供的一種日誌記錄,它用來記錄在MySQL中響應時間超過閥值的語句,具體運行時間超過long_query_time值的SQL,則會被記錄到慢查詢日誌中。html
(2)具體指運行時間超過long_query_time值的SQL,則會被記錄到慢查詢日誌中。long_query_time的默認值爲10,意思是運行10秒以上的語句。mysql
(3)由他來查看哪些SQL超出了咱們的最大 忍耐時間值,好比一條SQL執行超過5秒鐘,咱們就算慢SQL,但願能收集超過5秒的SQL,結合以前explain進行全面分析。linux
默認狀況下,MySQL數據庫沒有開啓慢查詢日誌,須要咱們手動來設置這個參數。sql
固然,若是不是調優須要的話,通常不建議啓動該參數,由於開啓慢查詢日誌會或多或少帶來必定的性能影響,慢查詢日誌支持將日誌記錄寫入文件。數據庫
(1)開啓設置函數
- SHOW VARIABLES LIKE '%slow_query_log%'; 查看慢查詢日誌是否開啓。默認狀況下 slow_query_log 的值爲 OFF,表示慢查詢日誌是禁用的
- set global slow_query_log=1; 開啓慢查詢日誌
- SHOW VARIABLES LIKE 'long_query_time%'; 查看慢查詢設定閾值 單位秒
- set long_query_time=1; 設定慢查詢閾值 單位秒
(2)永久生效,修改配置文件my.cnf中[mysql]下配置工具
slow_query_log=1性能
slow_query_log_file=/var/lib/mysql/atguigu-slow.log //日誌寫入文件優化
long_query_time=3 //慢SQL閥值ui
log_output=FILE //日誌文件格式
(3)運行查詢時間長的SQL,打開慢查詢日誌查看。
(1)查看mysqldumpslow的幫助信息
命令:[root@cocoon ~]# mysqldumpslow --help (linux環境)
(2)查看mysqldumpslow的幫助信息
- 獲得返回記錄集最多的10個SQL: mysqldumpslow -s r -t 10 c:/mysql/mysql.log
- 獲得訪問次數最多的 10 個 SQL: mysqldumpslow -s c -t 10 c:/mysql/mysql.log
- 獲得按照時間排序的前 10 條裏面含有左鏈接的查詢語句:
mysqldumpslow -s t -t 10 -g "left join" /var/lib/mysql/atguigu-slow.log
- 另外建議在使用這些命令時結合 | 和 more 使用 ,不然有可能出現爆屏狀況:
mysqldumpslow -s r -t 10 /var/lib/mysql/atguigu-slow.log | more
1). 建表語句
CREATE TABLE `dept` ( `id` INT(11) NOT NULL AUTO_INCREMENT, `deptName` VARCHAR(30) DEFAULT NULL, `address` VARCHAR(40) DEFAULT NULL, ceo INT NULL , PRIMARY KEY (`id`) ) ENGINE=INNODB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8; CREATE TABLE `emp` ( `id` INT(11) NOT NULL AUTO_INCREMENT, `empno` INT NOT NULL , `name` VARCHAR(20) DEFAULT NULL, `age` INT(3) DEFAULT NULL, `deptId` INT(11) DEFAULT NULL, PRIMARY KEY (`id`) #CONSTRAINT `fk_dept_id` FOREIGN KEY (`deptId`) REFERENCES `t_dept` (`id`) ) ENGINE=INNODB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
2). 設置參數
在執行建立函數以前,首先請保證 log_bin_trust_function_creators 參數爲 1,即 on 開啓狀態。 不然會報錯。
查詢:show variables like 'log_bin_trust_function_creators';
設置:set global log_bin_trust_function_creators=1;
固然,如上設置只存在於當前操做,想要永久生效,須要寫入到配置文件中:
在[mysqld]中加上 log_bin_trust_function_creators=1
3).建立函數
3.1 隨機產生字符串函數
CREATE FUNCTION `rand_string`(n int) RETURNS varchar(255) CHARSET utf8 BEGIN 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;
3.2 隨機產生部門編號
CREATE FUNCTION `rand_num`(from_num int, to_num int) RETURNS int(11) BEGIN DECLARE i int DEFAULT 0; SET i = FLOOR(from_num + RAND() * (to_num - from_num + 1)); RETURN i; END;
4). 建立存儲函數
4.1 建立往 emp 表中插入數據的存儲過程
CREATE PROCEDURE `insert_emp`(in start int(10), in max_num int(10)) BEGIN declare i int default 0; set autocommit = 0; repeat set i =i+1; INSERT INTO emp (empno, NAME ,age ,deptid ) VALUES ((START+i) ,rand_string(6) , rand_num(30,50),rand_num(1,10000)); until i = max_num end repeat; commit; END;
4.2 建立往 dept 表中插入數據的存儲過程
CREATE PROCEDURE `insert_dept`(max_num int) BEGIN DECLARE i int DEFAULT 0; SET autocommit = 0; REPEAT SET i = i + 1; INSERT INTO `dept` (`deptname`, `address`, `ceo`) VALUES (rand_string(8), rand_string(10), rand_num(1, 500000)); UNTIL i = max_num END REPEAT; COMMIT; END;
5).調用存儲過程
#執行存儲過程,往 dept 表添加 1 萬條數據DELIMITER ;CALL insert_dept(10000);#執行存儲過程,往 emp 表添加 50 萬DELIMITER ;CALL insert_emp(100000,500000);
Show Profile是mysql提供的能夠用來分析當前會話中SQL語句執行的資源消耗狀況的工具。可用於SQL調優的測量。默認狀況下處於關閉狀態,並保存最近15次的運行結果。
3.1 分析步驟
1. 開啓Show Profile功能,默認該功能是關閉的,使用前需開啓。
3.2. 批量導入數據
上面已作
3.3. 運行SQL,經過show profiles查看結果
3.4. 使用show profile對sql語句進行診斷。
經過上面的圖,能夠看出,第10條SQL查詢的時間很慢。咱們就來看看這條SQL語句的執行狀況
3.5. show profile的經常使用查詢參數
①ALL:顯示全部的開銷信息。
②BLOCK IO:顯示塊IO開銷。
③CONTEXT SWITCHES:上下文切換開銷。
④CPU:顯示CPU開銷信息。
⑤IPC:顯示發送和接受開銷信息。
⑥MEMORY:顯示內存開銷信息。
⑦PAGE FAULTS:顯示頁面錯誤開銷信息。
⑧SOURCE:顯示和Source_function,Source_file,Source_line相關的開銷信息。
⑨SWAPS:顯示交換次數開銷信息。
3.6. 須要注意的參數
①converting HEAP to MyISAM:查詢結果太大,內存不夠,數據往磁盤上搬了。
②Creating tmp table:建立臨時表。先拷貝數據到臨時表,用完後再刪除臨時表。
③Copying to tmp table on disk:把內存中臨時表複製到磁盤上,危險!!!
④locked。
show profile診斷結果中出現了以上4條結果中的任何一條,則sql語句須要優化。
#1.show profile默認是關閉的,而且開啓後只存活於當前會話,也就說每次使用前都須要開啓。若是永久開啓,修改配置文件。
#2.經過show profiles查看sql語句的耗時時間,而後經過show profile命令對耗時時間長的sql語句進行診斷。
#3.注意show profile診斷結果中出現相關字段的含義,判斷是否須要優化sql語句。
#4.可更多的關注MySQL官方文檔,獲取更多的知識。