PHP 之 MySQL 慢查詢那點事,你知多少?

一、簡介

開啓慢查詢日誌,可讓 MySQL 記錄下查詢超過指定時間的語句,經過定位分析性能的瓶頸,才能更好的優化數據庫系統的性能。php

二、參數介紹

slow_query_log 慢查詢開啓狀態html

slow_query_log_file 慢查詢日誌存放的位置(這個目錄須要 MySQL 的運行賬號的可寫權限,通常設置爲 MySQL 的數據存放目錄)mysql

long_query_time 查詢超過多少秒才記錄,默認是 10 秒laravel

三、開啓慢查詢

(1) 查看慢查詢相關參數sql

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)設置方法shell

方法一:全局變量設置數據庫

將 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 的檢查行數,很明顯的降低了。

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

參考文章:http://www.javashuo.com/article/p-mxjdkfye-ba.html

http://www.javashuo.com/article/p-pyrqdqbq-nu.html

點關注,不迷路

好了各位,以上就是這篇文章的所有內容了,能看到這裏的人呀,都是人才。以前說過,PHP方面的技術點不少,也是由於太多了,實在是寫不過來,寫過來了你們也不會看的太多,因此我這裏把它整理成了PDF和文檔,若是有須要的能夠

點擊進入暗號: PHP+「平臺」

在這裏插入圖片描述

在這裏插入圖片描述


更多學習內容能夠訪問【對標大廠】精品PHP架構師教程目錄大全,只要你能看完保證薪資上升一個臺階(持續更新)

以上內容但願幫助到你們,不少PHPer在進階的時候總會遇到一些問題和瓶頸,業務代碼寫多了沒有方向感,不知道該從那裏入手去提高,對此我整理了一些資料,包括但不限於:分佈式架構、高可擴展、高性能、高併發、服務器性能調優、TP6,laravel,YII2,Redis,Swoole、Swoft、Kafka、Mysql優化、shell腳本、Docker、微服務、Nginx等多個知識點高級進階乾貨須要的能夠免費分享給你們,須要的能夠加入個人 PHP技術交流羣

相關文章
相關標籤/搜索