您好,登錄后才能下訂單哦!
這篇文章主要為大家展示了“php mysql慢查詢是什么意思”,內容簡而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領大家一起研究并學習一下“php mysql慢查詢是什么意思”這篇文章吧。
php mysql慢查詢是指在日志中記錄運行比較慢的SQL語句,而開啟慢查詢日志,可以讓MySQL記錄下查詢超過指定時間的語句,通過定位分析性能的瓶頸,才能更好的優化數據庫系統的性能。
本文操作環境:windows7系統、PHP7.1版、DELL G3電腦
php mysql慢查詢是什么?
MySQL慢查詢就是在日志中記錄運行比較慢的SQL語句,這個功能需要開啟才能用。
1.簡介
開啟慢查詢日志,可以讓 MySQL 記錄下查詢超過指定時間的語句,通過定位分析性能的瓶頸,才能更好的優化數據庫系統的性能。
2、參數介紹
slow_query_log 慢查詢開啟狀態
slow_query_log_file 慢查詢日志存放的位置(這個目錄需要 MySQL 的運行帳號的可寫權限,一般設置為 MySQL 的數據存放目錄)
long_query_time 查詢超過多少秒才記錄,默認是 10 秒
3、開啟慢查詢
(1) 查看慢查詢相關參數
mysql> show variables like 'slow_query%'; +---------------------------+-----------------------------------+ | Variable_name | Value | +---------------------------+-----------------------------------+ | slow_query_log | OFF | | slow_query_log_file | /usr/local/var/mysql/slow.log | +---------------------------+-----------------------------------+ mysql> show variables like 'long_query_time'; +-----------------+-----------+ | Variable_name | Value | +-----------------+-----------+ | long_query_time | 10.000000 | +-----------------+-----------+
(2)設置方法
方法一:全局變量設置
將 slow_query_log 全局變量設置為 “ON” 狀態
mysql> set global slow_query_log='ON';
設置慢查詢日志存放的位置
mysql> set global slow_query_log_file='/usr/local/var/mysql/slow.log ';
設置慢查詢時間,查詢超過 1 秒就記錄
mysql> set global long_query_time=1;
方法二:配置文件設置
修改配置文件 my.cnf,在 [mysqld] 下的下方加入
[mysqld] slow_query_log = ON slow_query_log_file = /usr/local/var/mysql/slow.log long_query_time = 1
(3)重啟 MySQL 服務
service mysqld restart
(4)慢查詢日志分析
截取一段慢查詢日志:
# Time: 180918 19:06:21 # User@Host: proxy[proxy] @ [192.168.0.16] Id: 6707197 # Query_time: 1.015429 Lock_time: 0.000116 Rows_sent: 1 Rows_examined: 44438 SET timestamp=1537268781; select id, user_id, device_uuid, bd_client_id, bd_user_id, bd_tag, nodisturb_mode, nodisturb_start_time, nodisturb_end_time, binding_time, device_os_type, app_type, state from app_mobile_device where user_id = '78436' and app_type = 'YGY' order by binding_time desc; # User@Host: proxy[proxy] @ [192.168.0.16] Id: 6707236 # Query_time: 1.021662 Lock_time: 0.000083 Rows_sent: 1 Rows_examined: 44438 SET timestamp=1537268781; select id, user_id, device_uuid, bd_client_id, bd_user_id, bd_tag, nodisturb_mode, nodisturb_start_time, nodisturb_end_time, binding_time, device_os_type, app_type, state from app_mobile_device where user_id = '14433' and app_type = 'YGY' order by binding_time desc;
這里可以看到:
Query_time (慢查詢語句的查詢時間) 都超過了設置的 1s,
Rows_sent (慢查詢返回記錄) 這里只返回了 1 條
Rows_examined (慢查詢掃描過的行數) 44438 -> 通過這里大概可以看出問題很大
現在將這個 SQL 語句放到數據庫去執行,并使用 EXPLAIN 分析 看下執行計劃
EXPLAIN select id, user_id, device_uuid, bd_client_id, bd_user_id, bd_tag, nodisturb_mode, nodisturb_start_time, nodisturb_end_time, binding_time, device_os_type, app_type, state from app_mobile_device where user_id = '78436' and app_type = 'YGY' order by binding_time desc;
查詢結果是:
解釋下參數:
這里可以發現:rows 為查詢的行數,查詢了 4w 多行,那慢是肯定的了。
因為這里是好幾個條件,并且沒有使用一個索引,那就只能給添加索引了,
這里給選擇添加普通多列索引,因為這個表在最開始設計出問題了,導致有重復的數據,不能設置唯一索引了。
ALTER TABLE app_mobile_device ADD INDEX user_app_type_only ( `user_id` ,`app_type` )
索引設置了,再看下剛的 SQL 的執行計劃。
可以發現 rows 的檢查行數,很明顯的下降了。
到此,慢查詢的使用和優化就基本完成了。
以上是“php mysql慢查詢是什么意思”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業資訊頻道!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。