# SQL 性能分析 ## SQL 執行頻率 MySQL 客戶端連接成功後,通過 `show [session | global] status` 命令可以提供服務其狀態信息。通過下麵指令,可以查看當前資料庫 CRUD 的訪問頻次: `SHOW GLOBAL STATUS LIKE 'Com____ ...
SQL 性能分析
SQL 執行頻率
MySQL 客戶端連接成功後,通過 show [session | global] status
命令可以提供服務其狀態信息。通過下麵指令,可以查看當前資料庫 CRUD 的訪問頻次:
SHOW GLOBAL STATUS LIKE 'Com_______';
七個下劃線代表這個七個占位。
查詢資料庫中整體的 CURD 頻次,一般針對 select 比較多的資料庫。
慢查詢日誌
慢查詢日誌記錄了所有執行時間超過指定參數(long_query_time,單位:秒,預設 10 s)的所有 SQL 語句的日誌。
MySQL 的慢查詢日誌預設沒有開啟,需要在 MySQL 的配置文件(/etc/my.cnf)中配置如下信息:
# 開啟 MySQL 慢查詢日誌開關
slow_query_log=1
# 設置慢查詢的時間為 2 秒,SQL 語句執行時間操作 2 s,就會視為慢查詢,並記錄到慢查詢日誌中。
long_query_time=2
配置完成需重啟 MySQL 伺服器進行測試,查看慢查詢日誌文件的信息:/var/lib/mysql/localhost-slow.log
查看慢查詢日誌的開關情況
show variables like 'slow_query_log';
profile 詳情
能夠在做 SQL 優化時幫助我們瞭解時間都耗費到哪去了。通過 have_profiling
參數,能夠看到當前 MySQL 是否支持 profile
操作:
SELECT @@have_profiling;
預設情況下是關閉的(0),通過 set 語句可以選擇在 session/global
級別開啟 profile
:
SELECT @@profiling;
:查看 profiling
是否開啟
SET profiling = 1;
:開啟 profiling
相關操作效果:
# 查看每一條 SQL 的耗時基本情況
show profiles;
# 查看指定 query_id 的 sql 語句各個階段的耗時情況
show profile for query query_id;
# 查看指定 query_id 的 SQL 語句 CPU 的使用情況
show profile cpu for query query_id;
-
show profiles
\列分別是:SQL 語句的 id,執行時間秒,具體的 SQL 語句。
-
show profile for query 25
這條語句在各個狀態的耗時詳細情況。
-
show profile cpu for query 79
可以看到具體語句 CPU 的情況。
explain 執行計劃
explain 或者 desc 命令獲取 MySQL 如何執行 select 語句 的信息,包括 select 語句執行過程中表如何連接和連接順序。
語法:explain select 語句
explain 具體欄位解析:
那麼一般情況下重點關註的是以下幾個欄位:
- type:一般業務情況下是優化到
const、ref
(如果 type 類型是在後面的話) - possible_keys:可能會用到的索引與實際用到的索引進行對比,看看是否能通過索引來進行優化。
- key:實際用到的索引。
- key_len:索引的最大長度,越短越好(不丟失精度前提下)。
- filtered:值越大越好
- Extra:其他信息,也比較重要。
小結:
對於 SQL 性能分析這章,學習了 4 個點:
- SQL 執行頻率:查看資料庫中查詢是否執行頻率最高。
- 慢查詢日誌:查詢哪些 SQL 語句超過了規定時間,標記為慢查詢。
- profile 詳情:查看具體的 SQL 語句執行的耗時時間,包括各個階段的用時以及 CPU 情況。
- explain\desc:查看具體 SELECT 執行計劃,根據查詢到的欄位去進行 SQL 優化的方案。
後續將學習 SQL 優化的具體方案,以及不同的 SQL 優化。