MySQL 的性能(上篇)——SQL 執行時間分析
簡介
文中內容均為閱讀前輩的文章所整理而來,參考文章已在最後全指明
本文分為上下兩篇:
- 上篇:MySQL 的 SQL 執行時間分析
- 下篇:MySQL 性能優化
後端開發必然會接觸到資料庫,數據層的優劣會影響整個服務的響應時間。所以,資料庫的優化技巧是必須掌握的,下面就是我在學習過程中整理的,備忘。
SQL 執行時間分析
通過找到執行時間長的 SQL 語句,可以直觀的發現數據層的效率問題。
1.通過 show processlist 來查看系統的執行情況mysql> show processlist;
+----+------+-----------+------+---------+------+-------+------------------+
| Id | User | Host | db | Command | Time | State | Info |
+----+------+-----------+------+---------+------+-------+------------------+
| 2 | root | localhost | NULL | Query | 0 | init | show processlist |
+----+------+-----------+------+---------+------+-------+------------------+
1 row in set (0.01 sec)
2.通過 profiling 來進行查看
這個命令是查看 SQL 的執行時間,能很直觀的看出快慢。
2.1 查看 profiling 是否開啟0 代表還是關閉著分析功能
mysql> select @@profiling;
+-------------+
| @@profiling |
+-------------+
| 0 |
+-------------+
2.2 打開工具
mysql> set profiling=1;
Query OK, 0 rows affected, 1 warning (0.01 sec)
mysql> select @@profiling;
+-------------+
| @@profiling |
+-------------+
| 1 |
+-------------+
2.3 查看 SQL 的執行時間
mysql> show profiles;
+----------+------------+----------------------------+
| Query_ID | Duration | Query |
+----------+------------+----------------------------+
| 1 | 0.00173700 | select * from ip |
| 2 | 0.00057500 | select porxy, port from ip |
+----------+------------+----------------------------+
2.4 查看 SQL 執行耗時詳細信息
語法:show profile for query Query_ID
mysql> show profile for query 1;
+----------------------+----------+
| Status | Duration |
+----------------------+----------+
| starting | 0.000073 |
| checking permissions | 0.000031 | ---檢查是否在緩存中
| Opening tables | 0.000207 | ---打開表
| init | 0.000067 | ---初始化
| System lock | 0.000040 | ---鎖系統
| optimizing | 0.000005 | ---優化查詢
| statistics | 0.000021 |
| preparing | 0.000015 | ---準備
| executing | 0.000003 | ---執行
| Sending data | 0.000993 |
| end | 0.000006 |
| query end | 0.000007 |
| closing tables | 0.000011 |
| freeing items | 0.000169 |
| cleaning up | 0.000089 |
+----------------------+----------+
以上具體的信息都是從 INFORMATION_SCHEMA.PROFILING 這張表中取得的。這張表記錄了所有的各個步驟的執行時間及相關信息。語法:
select * from INFORMATION_SCHEMA.PROFILING where query_id = Query_ID;
MySQL 的慢查詢日誌,顧名思義就是把執行時間超過設定值(默認為10s)的 SQL 記錄到日誌中。這項功能需要手動開啟,但是開啟後會造成一定的性能損耗。
3.1 查看慢日誌是否開啟默認情況下slow_query_log的值為OFF,表示慢查詢日誌是禁用的,可以通過設置slow_query_log的值來開啟。語法:set global slow_query_log=1
mysql> show variables like "%slow_query_log%";
+---------------------+------------------------------------------------------+
| Variable_name | Value |
+---------------------+------------------------------------------------------+
| slow_query_log | OFF |
| slow_query_log_file | /usr/local/var/mysql/xueweihandeMacBook-Air-slow.log |
+---------------------+------------------------------------------------------+
2 rows in set (0.11 sec)
mysql> set global slow_query_log=1;
Query OK, 0 rows affected (0.03 sec)
mysql> show variables like "%slow_query_log%";
+---------------------+------------------------------------------------------+
| Variable_name | Value |
+---------------------+------------------------------------------------------+
| slow_query_log | ON |
| slow_query_log_file | /usr/local/var/mysql/xueweihandeMacBook-Air-slow.log |
+---------------------+------------------------------------------------------+
3.2 設置超時時間
- 設置語法:
set global long_query_time=4
- 查看語法:
show variables like "long_query_time"
注意:修改後,需要重新連接或新開一個會話才能看到修改值。
永久生效,修改 my.cnf
slow_query_log=1
long_query_time=10
slow_query_log_file=/path/mysql_slow.log
3.3 其他參數3.3.1 log_output
參數是指定日誌的存儲方式。log_output="FILE"表示將日誌存入文件,默認值是"FILE"。log_output="TABLE"表示將日誌存入資料庫,這樣日誌信息就會被寫入到mysql.slow_log表中。MySQL資料庫支持同時兩種日誌存儲方式,配置的時候以逗號隔開即可,如:log_output="FILE,TABLE"。日誌記錄到系統的專用日誌表中,要比記錄到文件耗費更多的系統資源,因此對於需要啟用慢查詢日誌,又需要能夠獲得更高的系統性能,那麼建議優先記錄到文件。
3.3.2 log-queries-not-using-indexes未使用索引的查詢也被記錄到慢查詢日誌中(可選項)。如果調優的話,建議開啟這個選項。另外,開啟了這個參數,其實使用full index scan的sql也會被記錄到慢查詢日誌。
3.3.3 log_slow_admin_statements表示是否將慢管理語句例如ANALYZE TABLE和ALTER TABLE等記入慢查詢日誌
3.4 分析工具 mysqldumpslowMySQL 提供了慢日誌分析工具 mysqldumpslow。
-s
表示按照何種方式排序;- c: 訪問計數
- l: 鎖定時間
- r: 返回記錄
- t: 查詢時間
- al:平均鎖定時間
- ar:平均返回記錄數
- at:平均查詢時間
-t
是top n的意思,即為返回前面多少條的數據;-g
後邊可以寫一個正則匹配模式,大小寫不敏感的;
3.4.1 命令示例
得到返回記錄集最多的 10 個 SQL:
mysqldumpslow -s r -t 10 /database/mysql/mysql06_slow.log
得到訪問次數最多的 10 個 SQL:
mysqldumpslow -s c -t 10 /database/mysql/mysql06_slow.log
得到按照時間排序的前10條裡面含有左連接的查詢語句:
mysqldumpslow -s t -t 10 -g 「left join」 /database/mysql/mysql06_slow.log
另外建議在使用這些命令時結合 | 和 more 使用 ,否則有可能出現刷屏的情況:
mysqldumpslow -s r -t 20 /mysqldata/mysql/mysql06-slow.log | more
參考
- MYSQL中SQL執行分析
- MySQL慢查詢日誌總結
※每天一道Java題「4」
※linux c++爬蟲(一)
※Azure Event Hub 技術研究系列2-發送事件到Event Hub
※文件通道解析二(文件鎖,關閉通道)
※光速 React
TAG:科技優家 |
※AMD兩款APU遊戲性能曝光;三星宣布Galaxy S9發布時間…
※小米MIX 2S發布時間曝光!性能與顏值兼并或將超越iPhone
※TrySail演唱《時間飛船》新OP單曲封面和MV公開
※NAMM 2018 展會:Beyerdynamic FOX 大振膜 USB 電容麥克風第一時間上手
※廉價iPhone SE2發布時間確定 小米MIX2S全新外形曝光
※YEEZY POWERPHASE 全黑配色發售時間曝光
※蘋果WWDC時間敲定 iOS12大升級且有新MacBook/iPad
※Pytorch實現CNN時間序列預測
※集邦短評|三星DRAM產能實際轉成CMOS的時間將會推遲
※下面是FINAL CUT邏輯問答時間
※《魔卡少女櫻 CLEAR CARD》:時間與情懷的回憶
※iOS 12、iPhone SE2發布時間曝光:蘋果速度
※NAMM2018展會:——Elk Music Operating System第一時間上手
※ADI用於Microsemi SiC功率模塊的隔離驅動器板加快產品上市時間
※NAMM 2018 展會:PreSonus 最堅硬外殼的 AudioBox USB 96 音頻介面第一時間上手
※iPhone SE2發布時間曝光
※誰這麼牛氣第一時間上腳?全新黃迷彩UNDEFEATED x Kobe 1 Protro PE曝光!
※IPFS項目:Filecoin上線時間延期至年底
※NAMM 2018 展會:PreSonus Quantum和Quantum 2 音頻介面第一時間上手
※SEVENFRIDAY七個星期五堂堂腕錶教你如何看時間了解使用