MySQL慢查詢
在web開發中,我們經常會寫出一些SQL語句,一條糟糕的SQL語句可能讓你的整個程序都非常慢,超過10秒一般用戶就會選擇關閉網頁,如何優化SQL語句將那些運行時間 比較長的SQL語句找出呢?MySQL給我們提供了一個很好的功能,那就是慢查詢!所謂的慢查詢就是通過設置來記錄超過一定時間的SQL語句!
PHP-FPM慢日志
php-fpm慢日志slowlog設置可以讓開發者很好的查找哪些php進程速度過慢而導致的網站問題,讓開發者方便的找到問題的所在。該方法同樣適用於排查nginx的500、502問題根源,當nginx收到如上錯誤碼時,可以確定后端php-fpm解析php出了某種問題,比如,執行錯誤,執行超時。
MySQL慢查詢的不足
1.MySQL5.0版本, long_query_time時間粒度不夠細,最小值為1秒。對於高並發性能的網頁腳本而言,1秒出現的意義不大。即出現1秒的查詢比較少。直到mysql5.1.21才提供更細粒度的long_query_time設定.
2.不能將服務器執行的所有查詢記錄到慢速日志中。雖然MySQL普通日志記錄了所有查詢,但是它們是解析查詢之前就記錄下來了。這意味着普通日志沒辦法包含諸如執行時間,鎖表時間,檢查行數等信息。
3.如果開啟了log_queries_not_using_indexes選項,slow query日志會充滿過多的垃圾日志記錄,這些快且高效的全表掃描查詢(表小)會沖掉真正有用的slow queries記錄。比如select * from category這樣的查詢也會被記錄下來。
1、如何開啟慢查詢?
首先我們先查看MYSQL服務器的慢查詢狀態是否開啟.
mysql>show variables like '%quer%';
開啟慢查詢非常簡單, 操作如下:
方法一
vi /etc/my.cnf 注:my.cnf是mysql的配置文件
在mysqld下方加入慢查詢的配置語句(一定要在[mysqld]的下方加入)
[mysqld]
log-slow-queries = /var/lib/mysql/mysql-slow.log
long_query_time = 1
保存退出 重啟mysql
log-slow-queries : 代表MYSQL慢查詢的日志存儲目錄, 此目錄文件一定要有寫權限。
long_query_time: sql最長執行時間。
方法二
在mysql命令行下執行如下操作:
set global slow_query_log=ON;
set global long_query_time=1;
測試
1、查看生成的慢日志記錄 此時是空的沒有記錄
cat mysql-slow.log
2、執行一條超過設置時間的sql語句 在查看是否被記錄
如:select sleep(1); 再去查看慢日子記錄
到此mysql慢查詢就OK了。
2、 如何開啟php-fpm慢日志?
php-fpm.conf的配置文件中有一個參數request_slowlog_timeout是這樣描述的:
當request_slowlog_timeout 設為一個具體秒時request_slowlog_timeout =5,表示如果哪個腳本執行時間大於5秒,會記錄這個腳本到慢日志文件中
request_slowlog_timeout =0表示關閉慢日志輸出。
慢日志文件位置默認在php的安裝目錄下的log文件夾中,可以通過修改slowlog = log/$pool.log.slow參數來指定。
php-fpm慢日志的例子,慢日志會記錄下進程號,腳本名稱,具體哪個文件哪行代碼的哪個函數執行時間過長。
request_slowlog_timeout 和 slowlog需要同時設置,開啟request_slowlog_timeout的同時需要開啟 slowlog
慢日志路徑需要手動創建 (slowlog)
具體開啟步驟如下:
結束。