共計 2056 個字符,預計需要花費 6 分鐘才能閱讀完成。
本篇內容介紹了“MySQL SQL 性能分析之慢查詢日志、explain 使用的方法是什么”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓丸趣 TV 小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!
SQL 執行頻率
MySQL 客戶端連接成功后,通過 show [session|global] status 命令可以提供服務器狀態信息。通過如下指令,可以查看當前數據庫的 insert、update、delete、delect 的訪問頻次:
-- session 是查看當前會話;
-- global 是查詢全局數據;
show global status like Com_______
Com_delete:刪除次數
Com_insert:插入次數
Com_select:查詢次數
Com_update:更新次數
通過上述指令,可以查看到當前數據庫是以查詢為主,還是以增刪改為主,從而為數據庫優化提供參考依據。如果以增刪改為主,可以考慮不進行索引優化。如果以查詢為主,要考慮對數據庫的索引進行優化。
慢查詢日志
慢查詢日志記錄了所有執行時間超過指定參數(long_query_time,單位:秒,默認 10 秒)的所有 SQL 語句的日志。
MySQL 的慢查詢日志默認不開啟,可以查看系統變量 slow_query_log。
-- 查看慢查詢日志是否開啟
show variables like slow_query_log
如果要開啟慢查詢日志,需要在 MySQL 的配置文件 (/etc/my.cnf) 中配置如下信息:
# 開啟 MySQL 慢日志查詢開關
slow_query_log=1
# 設置慢日志的時間為 2 秒,SQL 語句執行時間超過 2 秒,就會視為慢查詢,記錄慢查詢日志
long_query_time=2
配置完畢之后,通過以下指令重新啟動 MySQL 服務器進行測試,查看慢日志文件中記錄的信息 /var/lib/mysql/localhost-slow.log。
例如:導入近 1000w 條數據。執行以下 SQL:
select count(*) from tb_sku;
可以看到,耗時近 90 秒
profile
show profiles 能夠在做 SQL 優化時了解時間都耗費到了哪里。
通過 have_profiling 參數,能夠看到當前 MySQL 是否支持 profile 操作:
select @@have_profiling ;
查看 profile 是否開啟:
select @@profiling;
通過 set 語句在 session/global 級別開啟 profiling:
set profiling = 1;
執行一些 SQL 語句,然后就會記錄 SQL 的耗時明細了。
-- 查看每一條 SQL 的耗時基本情況
show profiles;
-- 查看指定 query_id 的 SQL 語句各個階段的耗時情況
show profile for query [query_id];
-- 查看指定 query_id 的 SQL 語句 CPU 的使用情況
show profile cpu for query [query_id];
explain
explain 或者 desc 命令獲取 MySQL 如何執行 select 語句的信息,包括在 select 語句執行過程中表如何連接和連接的順序。
-- 直接在 select 語句之前加上關鍵字 explain / desc
explain select 字段列表 from 表名 where 條件;
字段描述 idselect 查詢的序列號,表示查詢中執行 select 子句或者是操作表的順序
id 相同,執行順序從上到下;id 不同,值越大,越先執行 select_type 表示 select 的類型,常見的取值(不止這么多):
SIMPLE:簡單表,即不使用表連接或者子查詢
PRIMARY:主查詢,即外層的查詢
UNION:UNION 中的第二個或者后面的查詢語句
SUBQUERY:SELECT/WHERE 之后包含了子查詢 type 表示連接類型,性能由好到差的連接類型為 NULL(不查詢表)、system(訪問系統表)、const(主鍵或唯一索引)、eq_ref、ref(非唯一索引)、range、index(用了索引,遍歷全部索引樹)、all(全表掃描)。possible_key 顯示可能應用在這張表上的索引,一個或多個。key 實際使用的索引,如果為 NULL,則沒有使用索引。key_len 表示索引中使用的字節數,該值為索引字段最大可能長度,并非實際使用長度,在不損失精確性的前提下,長度越短越好。rowsMySQL 認為必須要執行查詢的行數,在 innodb 引擎的表中,是一個估計值,可能并不總是準確的。filtered 表示返回結果的行數占需讀取行數的百分比,filtered 的值越大越好。
“MySQL SQL 性能分析之慢查詢日志、explain 使用的方法是什么”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注丸趣 TV 網站,丸趣 TV 小編將為大家輸出更多高質量的實用文章!