首頁  >  文章  >  後端開發  >  php mysql 慢查詢是什麼

php mysql 慢查詢是什麼

藏色散人
藏色散人原創
2021-11-10 09:49:022363瀏覽

php mysql慢查詢是指在日誌中記錄執行比較慢的SQL語句,而開啟慢查詢日誌,可以讓MySQL記錄下查詢超過指定時間的語句,透過定位分析效能的瓶頸,才能更好的優化資料庫系統的效能。

php 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;

查詢結果是:

php mysql 慢查詢是什麼

解釋下參數:

php mysql 慢查詢是什麼

這裡可以發現: rows 為查詢的行數,查詢了4w 多行,那慢是肯定的了。

因為這裡是好幾個條件,並且沒有使用一個索引,那就只能給添加索引了,

這裡給選擇添加普通多列索引,因為這個表在最開始設計出問題了,導致重複的數據,不能設定唯一索引了。

ALTER  TABLE  app_mobile_device  ADD  INDEX user_app_type_only (  `user_id` ,`app_type` )

索引設定了,再看下剛的 SQL 的執行計畫。

php mysql 慢查詢是什麼

可以發現 rows 的檢查行數,很明顯的下降了。

到此,慢查詢的使用和最佳化就基本完成了。

推薦學習:《PHP影片教學

以上是php mysql 慢查詢是什麼的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn