Mysql慢查詢分析與優化

2021-07-11 21:17:45 字數 2848 閱讀 2928

慢查詢——顧名思義,耗時很長、響應很慢的查詢

危害——

導致整個資料庫響應變慢(過多消耗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...