詳解MySQL--慢查詢

蜀山客e發表於2020-12-05

簡介

開啟慢查詢日誌,可以讓MySQL記錄下查詢超過指定時間的語句,通過定位分析效能的瓶頸,才能更好的優化資料庫系統的效能。

一、配置慢查詢

1、引數說明

slow_query_log : 慢查詢開啟狀態(預設關閉)
slow_query_log_file : 慢查詢日誌存放的位置(這個目錄需要MySQL的執行帳號的可寫許可權, 一般設定為MySQL的資料存放目錄)
long_query_time : 查詢超過多少秒才記錄(預設10秒)

2.檢視慢查詢相關引數

show variables like 'slow_query%';
+---------------------------+----------------------------------+
| Variable_name             | Value                            |
+---------------------------+----------------------------------+
| slow_query_log            | OFF                              |
| slow_query_log_file       | /mysql/data/localhost-slow.log   |
+---------------------------+----------------------------------+

show variables like 'long_query_time';
+-----------------+-----------+
| Variable_name   | Value     |
+-----------------+-----------+
| long_query_time | 10.000000 |
+-----------------+-----------+

3.配置慢查詢

它有兩種配置方式,一種是全域性變數配置,一種是配置檔案配置

(1)全域性變數配置

--將 slow_query_log 全域性變數設定為“ON”狀態
    set global slow_query_log='ON'; 

 --設定慢查詢日誌存放的位置
  set global slow_query_log_file='/usr/local/mysql/data/slow.log';

 --查詢超過1秒就記錄
   set global long_query_time=1;

(2)修改配置檔案my.cnf(linux環境下)

slow_query_log = ON
    slow_query_log_file = /usr/local/mysql/data/slow.log
    long_query_time = 1

總結:
(1)通過全域性變數配置好後,需要關閉會話後重新開啟查詢才有效,通過配置檔案需要重啟Mysql伺服器後才有效
(2) 因為開啟慢查詢會影響效能,一般建議通過全域性變數配置,這樣重啟伺服器又是預設關閉慢查詢狀態。

二、mysqldumpslow工具

mysqldumpslow是Mysql自帶的一個工具,有了它我們可以不用去上面的log檔案去找,如果資料平凡操作,那麼去log查下日誌也是比較繁瑣的一件事。

1、主要命令

--s:是表示按照何種方式排序 
   --c:訪問次數 
   --l:鎖定時間 
   --r:返回記錄 
   --t:查詢時間 
   --al:平均鎖定時間 
   --ar:平均返回記錄數 
   --at:平均查詢時間 
   --t:即為返回前面多少條的資料 
   --g:後面搭配一個正則匹配模式,大小寫不敏感

2、舉例

--1.得到返回記錄集最多的10個SQL
   mysqldumpslow -s -r -t 10 /logs/mysql-slow.log

 --2.得到訪問次數最多的10個SQL
   mysqldumpslow -s -c -t 10 /logs/mysql-slow.log

 --3.得到按照時間排序的前10條裡面含有做連結的查詢語句
   mysqldumpslow -s t -t 10 -g "left join" /logs/mysql-slow.log
 
 --4.另外建議在使用這些命令時結合|和more使用,否則又可能出現爆屏情況
   mysqldumpslow -s r -t 10 /logs/mysql-slow.log | more

三、show profile

Show profiles是5.0.37之後新增的,要想使用此功能,要確保版本在5.0.37之後。

1、開啟 show profile

show variables like "profiling";--預設是關閉的
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| profiling     | OFF   |
+---------------+-------+

--開啟
set profiling=1;

2、執行指定SQL

我這裡執行幾條SQL語句,然後執行

show profiles;--會列出所有在這個開啟期間執行的SQL,並附上QUERY ID
+----------+------------+----------------------------+
| Query_ID | Duration   | Query                      |
+----------+------------+----------------------------+
|        1 | 0.00168025 | select * from vhr.employee |
|        2 | 0.06573200 | select * from vhr.hr       |
+----------+------------+----------------------------+
--我們可以看到顯示最近操作的兩條語句,列表大小由profiling_history_size會話變數控制, 預設值為15.最大值為100

3、診斷具體SQL

show profile cpu,block io for queryid  --對應2中的query_id

SHOW PROFILE CPU FOR QUERY 1;--查詢query_id為1的具體資訊
+----------------------+----------+----------+------------+
| Status               | Duration | CPU_user | CPU_system |
+----------------------+----------+----------+------------+
| starting             | 0.000194 | 0.000000 |   0.000000 |
| checking permissions | 0.000012 | 0.000000 |   0.000000 |
| Opening tables       | 0.000030 | 0.000000 |   0.000000 |
| init                 | 0.000053 | 0.000000 |   0.000000 |
| System lock          | 0.000011 | 0.000000 |   0.000000 |
| optimizing           | 0.000003 | 0.000000 |   0.000000 |
| statistics           | 0.000014 | 0.000000 |   0.000000 |
| preparing            | 0.000010 | 0.000000 |   0.000000 |
| executing            | 0.000001 | 0.000000 |   0.000000 |
| Sending data         | 0.001213 | 0.000000 |   0.000000 |
| end                  | 0.000014 | 0.000000 |   0.000000 |
| query end            | 0.000012 | 0.000000 |   0.000000 |
| closing tables       | 0.000019 | 0.000000 |   0.000000 |
| freeing items        | 0.000070 | 0.000000 |   0.000000 |
| cleaning up          | 0.000025 | 0.000000 |   0.000000 |
+----------------------+----------+----------+------------+

需要注意的結論:

1 converting HEAP to MyISAM : 查詢結果太大,記憶體都不夠用了,往磁碟上搬了;
2 creating tmp table :    建立臨時表,拷貝資料到臨時表,然後再刪除;
3 copying to tmp table on disk :把記憶體中臨時表複製到磁碟,危險!!!
4 locked

注:以上四個中若出現一個或多個,表示sql 語句 必須優化。

在這裡插入圖片描述
希望本文對你有所幫助~~感興趣可以加入我們。642830685,技術大牛解惑答疑,同行一起交流。

相關文章