慢日志分析工具—mysqldumpslow 和 mysqlsla

前提:分析mysql性能的時(shí)候會(huì)查看數(shù)據(jù)庫的哪些sql語句有問題,效率低。這就用到了數(shù)據(jù)庫的慢查詢,作用就是: 它能記錄下所有執(zhí)行超過long_query_time時(shí)間的SQL語句,幫你找到執(zhí)行慢的SQL,方便我們對(duì)這些SQL進(jìn)行優(yōu)化。

1.配置慢查詢

在mysql客戶端執(zhí)行

mysql> show variables like "%query%" ;

得到結(jié)果:


設(shè)置慢查詢.png

涉及參數(shù)解釋:
slow_query_log :是否開啟慢查詢,ON 開啟,OFF關(guān)閉
修改參數(shù)使用命令:

set global slow_query_log=ON;   #開啟MySQL慢查詢功能

long_query_time :慢查詢時(shí)間設(shè)置,默認(rèn)是10秒
slow_query_log_file :慢查詢?nèi)罩敬娣怕窂?/p>

還可以通過修改MySQL配置文件參數(shù),開啟MySQL慢查詢。vi /etc/my.cnf ,在[mysqld]段添加以下代碼:

slow-query-log = on  #開啟MySQL慢查詢功能
slow_query_log_file = /data/mysql/127-slow.log  #設(shè)置MySQL慢查詢?nèi)罩韭窂?long_query_time = 5  #修改為記錄5秒內(nèi)的查詢,默認(rèn)不設(shè)置此參數(shù)為記錄10秒內(nèi)的查詢
log-queries-not-using-indexes = on  #記錄未使用索引的查詢

:wq! #保存退出
service mysqld restart #重啟MySQL服務(wù)

2.查看慢查詢?nèi)罩?/h4>

執(zhí)行sql后就可以看到配置的路徑下面有日志生成了,對(duì)于得到的日志有2中方式可以對(duì)其分析,一是mysql自帶的 mysqldumpslow,另外一個(gè)是要獨(dú)自安裝的 mysqlsla,下面分別介紹一下。

2.1 mysqldumpslow 分析慢查詢?nèi)罩?/h6>

執(zhí)行命令:

[root@chances126 /]# mysqldumpslow   /var/lib/mysql/mysql-slow.log

得到的信息解釋:

主要功能是, 統(tǒng)計(jì)不同慢sql的
出現(xiàn)次數(shù)(Count),
執(zhí)行最長時(shí)間(Time),
累計(jì)總耗費(fèi)時(shí)間(Time),
等待鎖的時(shí)間(Lock),
發(fā)送給客戶端的行總數(shù)(Rows),
掃描的行總數(shù)(Rows),
用戶以及sql語句本身(抽象了一下格式, 比如 limit 1, 20 用 limit N,N 表示).

對(duì)我而言,看到返回的這一對(duì)信息,我是崩潰的,也沒有提示是哪個(gè)數(shù)據(jù)庫報(bào)的,一般一臺(tái)服務(wù)器有很多數(shù)據(jù)庫,這樣根本看不出來啊。我不偏愛這個(gè)工具,雖然他是不用安裝的。

2.2 mysqlsla 分析慢查詢?nèi)罩?/h6>

這個(gè)工具需要安裝,看下如何安裝吧。Linux如何安裝 mysqlsla
安裝好后,接下來就是使用了:

#查詢記錄最多的10條,可以指定具體的數(shù)據(jù)庫 
mysqlsla -lt slow -sort t_sum   -sf  "+select,update,INSERT" -db hunaniptv  -top 10   /var/lib/mysql/mysqld_slow.log 

#查詢記錄最多的20個(gè)sql語句,并寫到select.log中去
mysqlsla -lt slow --sort t_sum --top 20  /data/mysql/127-slow.log >/tmp/select.log

#統(tǒng)計(jì)慢查詢文件為/data/mysql/127-slow.log的所有select的慢查詢sql,并顯示執(zhí)行時(shí)間最長的100條sql,并寫到sql_select.log中去

mysqlsla -lt slow  -sf "+select" -top 100  /data/mysql/127-slow.log >/tmp/sql_select.log

#統(tǒng)計(jì)慢查詢文件為/data/mysql/127-slow.log的數(shù)據(jù)庫為mydata的所有select和update的慢查詢sql,并查詢次數(shù)最多的100條sql,并寫到sql_num.sql中去

mysqlsla -lt slow  -sf "+select,update" -top 100 -sort c_sum  -db mydata /data/mysql/127-slow.log >/tmp/sql_num.log

得到的信息大概是這種樣子:

mysqlsla分析慢查詢.png

返回參數(shù)解釋:

Count, sql的執(zhí)行次數(shù)及占總的slow log數(shù)量的百分比.
Time, 執(zhí)行時(shí)間, 包括總時(shí)間, 平均時(shí)間, 最小, 最大時(shí)間, 時(shí)間占到總慢sql時(shí)間的百分比.
95% of Time, 去除最快和最慢的sql, 覆蓋率占95%的sql的執(zhí)行時(shí)間.
Lock Time, 等待鎖的時(shí)間.95% of Lock , 95%的慢sql等待鎖時(shí)間.Rows sent, 結(jié)果行統(tǒng)計(jì)數(shù)量, 包括平均, 最小, 最大數(shù)量.
Rows examined, 掃描的行數(shù)量.
Database, 屬于哪個(gè)[數(shù)據(jù)庫]
Users, 哪個(gè)用戶,IP, 占到所有用戶執(zhí)行的sql百分比
Query abstract, 抽象后的sql語句
Query sample, sql語句

對(duì)于得到這個(gè)信息還可以進(jìn)一步分析,就是登陸到mysql 的客戶端,登陸數(shù)據(jù)庫,執(zhí)行 EXPLAIN查看sql具體的 type 信息。

[root@chances126 /]# 
mysql> use  sc_epg_release4
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
mysql> EXPLAIN select distinct a.*    from EPG_CONTENT_SERIES a join EPG_CATEGORY_ITEM b on a.CONTENT_CODE = b.ITEM_CODE     where a.ENABLE_STATUS=1 and b.STATUS=0 and a.EXTERNAL_CODE = '2000000200000010042000000006088';
+----+-------------+-------+------+---------------+-------------+---------+-----------------------------+-------+------------------------------+
| id | select_type | table | type | possible_keys | key         | key_len | ref                         | rows  | Extra                        |
+----+-------------+-------+------+---------------+-------------+---------+-----------------------------+-------+------------------------------+
|  1 | SIMPLE      | b     | ALL  | NULL          | NULL        | NULL    | NULL                        | 28504 | Using where; Using temporary |
|  1 | SIMPLE      | a     | ref  | seriesIndex   | seriesIndex | 387     | sc_epg_release4.b.ITEM_CODE |     1 | Using where                  |
+----+-------------+-------+------+---------------+-------------+---------+-----------------------------+-------+------------------------------+
2 rows in set (0.00 sec)

mysql> 

可以看出 a 表是全表查詢,b表級(jí)別是 ref ,可以進(jìn)一步分析 sql 了。
性能從最好到最差:system、const、eq_reg、ref、range、index和ALL.
每個(gè)級(jí)別的含義: https://blog.csdn.net/netuser1937/article/details/124843721

如果看到性能不好,就可以把sql給研發(fā)去分析了。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容