mysql性能問題定位 ? 2 條評論 ? mysql性能問題定位 2013 年 8 月 28 日, by 徐旭 , 所屬分類 數(shù)據(jù)庫, 測試技術. ??使用mysql作為基礎數(shù)據(jù)庫的應用,可能會遇到一些數(shù)據(jù)庫方面的性能問題,我們可以通過一些方法進行問題定位。以下介紹可以定位性能問題的四種
mysql性能問題定位?
??使用mysql作為基礎數(shù)據(jù)庫的應用,可能會遇到一些數(shù)據(jù)庫方面的性能問題,我們可以通過一些方法進行問題定位。以下介紹可以定位性能問題的四種方法,歡迎拍磚。
一、開啟慢查詢日志:
記錄執(zhí)行查詢時間大于long_query_time的sql,long_query_time默認為2s;
show variables like ‘%slow%’
?
?
得到圖中所示信息,這里可以查看到慢查詢日志是否開啟,慢查詢日志文件的存放目錄。
開啟慢查詢日志的方法:
1、vi ?/etc/my.cnf(這個是mysql的默認讀取配置文件目錄,一般會將my.cnf文件放在這下面)
[mysqld]下添加
slow_query_log=ON
long_query_time=1(sql語句執(zhí)行時間超過該參數(shù)值,則會打印在慢查詢日志中),默認執(zhí)行時間超過2s的sql會打印在慢查詢日志中。
修改了my.cnf中的配置項,需要重啟數(shù)據(jù)庫。
2、不重啟數(shù)據(jù)庫的情況下,執(zhí)行 set global slow_query_log=ON,可以開啟慢查詢日志。
開啟慢查詢日志后,跟蹤慢查詢日志文件中的慢查詢sql,再具體分析,通過調整sql寫法,或者添加正確的索引,可以看到意想不到的性能效果。
二、分析慢查詢sql:
1、Explain 打印執(zhí)行計劃
執(zhí)行的selcet語句前面加上explain,可以告訴你mysql如何執(zhí)行該條語句。
?
這里需要額外注意type、key、rows 、extra列展示的內容。
其中,
Type=all,表示使用的是全表掃描,在數(shù)據(jù)量大的情況下,全表掃描是非常耗性能的,這個需要特別注意;
Type=index,表示使用索引掃描,只會遍歷索引樹;
Type=range,表示使用索引范圍掃描,常見于between 、>、<等的查詢。
Type=ref,非唯一性索引掃,返回匹配某個單獨值得所有行
Type=eq_ref 唯一性索引掃描,對于每個索引鍵,表中只有一條記錄與之匹配
Type=const/system???讀常量,最多只會有一條記錄匹配,由于是常量,實際上只須要讀一次
Type=null 不需要掃描表
訪問類型從上到下由差變?yōu)樽詈谩?/p>
key表示select中使用到的索引,如果為null,表示沒有使用索引,從查詢效率上講,使用索引比不使用索引快。但并不是所有的都要加索引,索引也存在不足,這里就不詳解。
rows表示執(zhí)行該條sql所需要掃描的行數(shù),這個沒有絕對值可參考,一般來說越小越好,如果100萬數(shù)據(jù)量的數(shù)據(jù)庫,rows是70萬,通過這個可以判斷sql的查詢性能很差,如果100萬條數(shù)據(jù)量的數(shù)據(jù)庫,rows是1萬,從我個人的角度,還是能接受的。
extra
一些十分重要的額外信息,重點關注出現(xiàn)關鍵字:
Using filesort:當Query 中包含order by 操作,而且無法利用索引完成排序操作的時候,MySQL Query Optimizer 不得不選擇相應的排序算法來實現(xiàn)。
Using temporary:在某些操作中必須使用臨時表時,在 Extra 信息中就會出現(xiàn)Using temporary ,主要常見于 GROUP BY 和 ORDER BY 等操作中
當 執(zhí)行計劃Extra 出現(xiàn)Using filesort 、Using temporary 時,可以考慮是否需要進行sql優(yōu)化和調整索引,最后再調整my.cnf 中與排序或者臨時表相關的參數(shù),如sort_buffer_size或者tmp_table_size.
2、show full processlist 查看哪條sql一直占用進程
?
Time表示執(zhí)行當前操作所耗費的時間,單位為秒(s); State表面當前線程的狀態(tài),Info表示正在執(zhí)行的操作; 這里如果發(fā)現(xiàn)time值比較大,state一直處于一個狀態(tài),那么從Info中我們可以獲得耗時長的操作,再具體分析; 注意觀察State中出現(xiàn)關于lock關鍵字的狀態(tài)。 這個命令可以很直觀地看到正在執(zhí)行的sql,及其當前狀態(tài),操作比較方便。3、show profile 定位sql在數(shù)據(jù)庫中資源占用情況(注意,一個是show profiles,一個是show profile)
Show profiles主要展示在當前會話中,profiling_history_size條sql執(zhí)行的時間、query_id,默認為15條,最大為100條,不能設為0。 SHOW VARIABLES LIKE ‘%profiling_history_size%’?
SHOW VARIABLES LIKE ‘%profiling’或者select @@profiling 查看profiling是否開啟
?
?
set profiling=1 開啟profiling
執(zhí)行一條sql
?
?
?
?
再執(zhí)行show profiles,會把最近執(zhí)行的sql給展示出來,
?
?
從圖中找到剛剛執(zhí)行的sql,query_id是120,執(zhí)行時間是0.00079725s
如果我們想看sql在各個階段所消耗時間,則使用如下
SHOW PROFILE FOR QUERY 120
?
?
?
?
?
?
?
?
各個階段所消耗時間一目了然。
show profile具體寫法為 Show profile TYPE for query n,n為query_id,TYPE可寫可不寫
TYPE的取值有為ALL、BLOCK IO、CONTEXT SWITCHES、CPU、IPC、MEMORY、PAGE FAULTS、SOURCE、SWAPS
如上述例子中
SHOW PROFILE CPU,MEMORY FOR QUERY 120
?
?
?
?
?
不加for query n這句,則展示執(zhí)行show profile之前執(zhí)行過一條語句。
4、Mysqladmin 查詢整個數(shù)據(jù)庫的狀態(tài)
在mysql的bin目錄下,執(zhí)行
./mysqladmin -u用戶名 -p密碼 proc stat
?
?
這里添加proc就如同show full processlist功效
stat展示當前數(shù)據(jù)庫的狀態(tài)
threads 表示當前線程數(shù),Opens 當前打開的表數(shù)目,Queries per second 每秒執(zhí)行的查詢數(shù),數(shù)據(jù)庫性能越好,這個值就越高
聲明:本網(wǎng)頁內容旨在傳播知識,若有侵權等問題請及時與本網(wǎng)聯(lián)系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com