慢查詢——顧名思義,耗時很長、響應很慢的查詢
危害——
導致整個資料庫響應變慢(過多消耗cpu或者io)
短連線場景下還可能引起耗盡連線數
以下引數均是是在mysql的配置檔案/etc/my.cnf中配置的,配置在[mysqld]下。
引數名含義
slow_query_log
是否開啟慢查詢
long_query_time
查詢消耗超過多少時間認為是慢查詢,單位秒
log_output
日誌的輸出形式(file或者table)
slow-query-log-file
慢查詢的儲存檔案
log-queries-not-using-indexes
記錄沒有使用索引的查詢
示例引數配置
# 慢查詢相關
slow_query_log = 1
long_query_time = 1
# 日誌的輸出形式
log_output = file
slow-query-log-file = /var/log/mysql/mysql-slow.log
修改引數之後記得重啟mysqld服務,可以在mysql命令列驗證修改是否生效。命令如下:
mysql> show global variables like
'slow%' ;
mysql> show global variables like
'long%' ;
mysql> show global variables like
'log%' ;
經過上面的配置mysql的慢日誌就開啟了,然後mysql就會記錄各條查詢相關資訊了,下面是乙個人為構造的演示例子。
下面是用來新建測試用的表和查詢語句的sql命令。
mysql> use test;
mysql> create table b (id int not null primary key, name varchar(100) not null);
mysql> select sleep(1);
mysql> select * from b where name = 'a';
mysql> select * from b where name = 'b';
mysql> select * from b where name = 'c';
我們可以直接看下mysql-slow.log中的內容,cat或vim都行,只是看一眼:)
# cat /var/log/mysql/mysql-slow.log
下面是檔案中個引數意義的介紹:
querytime: sql的請求執行時間
locktime: sql 等鎖的時間
rows_examined: sql處理過程中掃瞄的行數;通常,該值越大,對cpu/io消耗也就越大
首先是慢查詢分析工具——mysqldumpslow,示例用法如下:
# mysqldumpslow -t 10 -s t /path/to/slow.log
引數說明:
1. -t:返回前面多少條的資料,即top幾;
2. -s:排序方式。c , t , l , r 分別表示記錄次數、時間、查詢時間的多少、返回的記錄數排序;ac , at , al , ar 表示相應的倒敘;
table型別慢日誌處理
直接做工具處理相對比較麻煩,但我們可以變相處理。
處理思路:
1. 將mysql.slow_log表的資料轉成日誌檔案形式
2. 然後再用mysqldumpslow進行分析
這裡提供乙個工具(python指令碼,需要先安裝mysql-python依賴庫),可以將mysql.slow_log表匯出成日誌格式
例如,要列出2016-5-1至2016-5-18期間的慢查詢
# python slow_log_dump.py 10.6
.29.129
3306 root 123456
'2016-5-1'
'2016-5-18'
記錄slowlog僅僅是第一步,更重要的是找到慢查詢的根源。
而這裡,我們可以利用explain命令,對慢查詢sql執行explain得到對應的執行計畫進行分析,從而確定如何優化。
mysql> explain select * from b where name = 'a';
各個引數說明
關鍵列名
含義type
使用了什麼查詢方式,由好到差,依次為const > eq_ref > ref > range > index > all注意: index表示遍歷索引;而ref表示使用非唯一的索引
key最終使用到的索引
ref使用了索引的那一列,可能為列名或者const
rows
掃瞄的行數
extra
附加資訊,比如」using where」、「using index」、「using filesort」、「using temporary」
1.嚴禁在mysql執行複雜的計算,以免過多消耗cpu,把複雜的事情交給程式處理
2.盡可能少用關聯查詢,如果不得不使用,最好不超過2個表,以免笛卡爾積過大,一方面增加讀取磁碟機率,一方面有可能生成檔案臨時表,極大影響io
3.適當的使用索引,且僅對離散程度比較高的列使用,讓索引的效果可以最大化;索引是犧牲了寫效能來換取讀效能,因此也不能過多
4.控制單錶的資料量,多作分庫分表
mysql慢查詢日誌查詢與分析
mysql下執行show variables like slow query log 上圖我這是本地的mysql,慢查詢沒開。slow query log on和off分別表示慢查詢有沒有開。slow query log file 慢查詢日誌的路徑。開啟日誌 我們可以看到 time 180810 1...
Mysql優化 慢查詢
先查詢是否開啟 開啟慢查詢日誌 set global slow query log 1 檢視引數設定 show variables like long query time 這裡查詢的是查過多少時間才會記錄成慢查詢 預設10 秒以上的s ql語句記錄到日誌中 修改引數 set global long...
Mysql慢查詢優化
二 優化這些慢查詢 3.細節優化 一般的應用系統,讀寫比例在10 1左右,而且插入操作和一般的更新操作很少出現效能問題,遇到最多的,也是最容易出問題的,還是一些複雜的查詢操作 修改配置檔案 在 my.ini 增加幾行 slow query log on log slow queries 儲存路徑 l...