MySQL如何定位慢sql
MySQL“慢SQL”定位
數據庫調優我個人覺得必須要明白兩件事
1.定位問題(你得知道問題出在哪里,要不然從哪里調優呢)
2.解決問題(這個沒有基本的方法來處理,因為不同的問題處理的方式方法不一樣,得從實踐中不斷的探索,如sql調優,配置優化,硬件升級等等)
步驟1:查詢是否開啟了慢查詢
mysql> show variables like '%slow%';
+---------------------------+--------------------------------+
| Variable_name | Value |
+---------------------------+--------------------------------+
| log_slow_admin_statements | OFF |
| log_slow_slave_statements | OFF |
| slow_launch_time | 2 |
| slow_query_log | ON |
| slow_query_log_file | /data/mysql/localhost-slow.log |
+---------------------------+--------------------------------+
5 rows in set (0.01 sec)
mysql>
以MySQL5.7為例
我這里是開啟了,沒有開啟的,直接set global slow_query_log=on;
就ok了。
mysql> set global slow_query_log=on;
Query OK, 0 rows affected (0.05 sec)
步驟2:設置慢查詢的時間限制
mysql默認的慢查詢時間是10秒,可以設置成其它的時間。
mysql> show variables like 'long_query_time';
+-----------------+-----------+
| Variable_name | Value |
+-----------------+-----------+
| long_query_time | 10.000000 |
+-----------------+-----------+
1 row in set (0.03 sec)
mysql> set long_query_time=1;
Query OK, 0 rows affected (0.00 sec)
mysql> show variables like 'long_query_time';
+-----------------+----------+
| Variable_name | Value |
+-----------------+----------+
| long_query_time | 1.000000 |
+-----------------+----------+
1 row in set (0.00 sec)
mysql>
set global 只是全局session生效,重啟后失效,如果需要以上配置永久生效,需要在mysql.ini(linux my.cnf)中配置
步驟3:查看慢查詢
show status like ‘slow_queries’;
它會顯示慢查詢sql的數目,具體的sql就在上面的Log file日志中可以看到。
mysql> show status like 'slow_queries';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| Slow_queries | 0 |
+---------------+-------+
1 row in set (0.01 sec)
mysql>
其它命令
show processlist: 查看哪些線程在運行;
show open tables:查看哪些表在使用。
慢查詢分析日志
改一下慢查詢配置
mysql> set long_query_time=0.1;
Query OK, 0 rows affected (0.05 sec)
mysql>
執行幾條慢的SQL
mysql> select count(*) from users;
+----------+
| count(*) |
+----------+
| 100005 |
+----------+
1 row in set (0.28 sec)
mysql> select * from users;
...
...
100005 rows in set (1.41 sec)
mysql>
mysql> select count(*) from user_address_copy;
+----------+
| count(*) |
+----------+
| 30006 |
+----------+
1 row in set (0.08 sec)
mysql> select * from user_address_copy;
...
...
30006 rows in set (0.39 sec)
mysql>
vim 打開慢查詢記錄的文件slow_query_log_file
| /data/mysql/localhost-slow.log
vim /data/mysql/localhost-slow.log
localhost-slow.log 內容如下:
/software/mysql/bin/mysqld, Version: 5.7.24 (MySQL Community Server (GPL)). started with:
Tcp port: 3306 Unix socket: /software/mysql/mysql.sock
Time Id Command Argument
# Time: 2018-12-08T03:08:23.877322Z
# User@Host: root[root] @ localhost [] Id: 24
# Query_time: 0.551358 Lock_time: 0.000514 Rows_sent: 1 Rows_examined: 100005
use test;
SET timestamp=1544238503;
select count(*) from users;
# Time: 2018-12-08T03:09:06.038256Z
# User@Host: root[root] @ localhost [] Id: 24
# Query_time: 1.401716 Lock_time: 0.000220 Rows_sent: 100005 Rows_examined: 100005
SET timestamp=1544238546;
select * from users;
# Time: 2018-12-08T03:12:03.207302Z
# User@Host: root[root] @ localhost [] Id: 24
# Query_time: 0.395499 Lock_time: 0.000378 Rows_sent: 30006 Rows_examined: 30006
SET timestamp=1544238723;
select * from user_address_copy;
Time
:日志記錄的時間
User@Host
:執行的用戶及主機
Query_time
:查詢耗費時間 Lock_time 鎖表時間 Rows_sent 發送給請求方的記錄條數 Rows_examined 語句掃描的記錄條數
SET timestamp
語句執行的時間點
select ....
執行的具體語句
慢查詢日志分析工具
分析慢查詢日志是性能調優中獲取信息的主要方式之一。
如果slow log比較小,那么可以直接使用vi等文本編輯器或less、more命令打開。但如果slow log過大,載入慢查詢日志將耗費大量時間,這個時候就要考慮使用其他工具來對慢查詢進行分析了。
mysql的自帶工具mysqldumpslow,可以有效的幫助我們對slow log進行篩選和分析。
官方文檔5.7版本地址:https://dev.mysql.com/doc/refman/5.7/en/mysqldumpslow.html
參看官方文檔可以略去本文。
執行mysqldumpslow –h
可以查看幫助信息。
主要介紹兩個參數-s和-t
-s 這個是排序參數,可選的有:
al: 平均鎖定時間
ar: 平均返回記錄數
at: 平均查詢時間
c: 計數
l: 鎖定時間
r: 返回記錄
t: 查詢時間
-t n 顯示頭n條記錄。
實例:
mysqldumpslow -s c -t 20 host-slow.log
mysqldumpslow -s r -t 20 host-slow.log
上述命令可以看出訪問次數最多的20個sql語句和返回記錄集最多的20個sql。
mysqldumpslow -t 10 -s t -g “left join” host-slow.log
這個是按照時間返回前10條里面含有左連接的sql語句。
用了這個工具就可以查詢出來那些sql語句是性能的瓶頸,進行優化,比如加索引,該應用的實現方式等。
其他工具
//TODO 暫時還沒了解,先記錄一下
mysqlsla
pt-query-digest
參考鏈接:https://www.cnblogs.com/WONDERFUL-cnblogs/p/5481358.html
原文地址:https://blog.csdn.net/weixin_38028611/article/details/99355039 </div>