Mysql慢查询深入剖析_《深入精通Mysql(六)》系列之如何通过慢查询日志进行SQL分析和优化...
深入精通Mysql系列其他文章推薦:
從本系列第一篇《深入精通Mysql(一)》系列之Mysql整體架構(gòu)和sql執(zhí)行過(guò)程我們就可以知道一條sql語(yǔ)句的執(zhí)行過(guò)程會(huì)經(jīng)過(guò)優(yōu)化器進(jìn)行優(yōu)化。
優(yōu)化器就是對(duì)我們的 SQL 語(yǔ)句進(jìn)行分析,生成執(zhí)行計(jì)劃。
問(wèn)題:在我們做項(xiàng)目的時(shí)候,有時(shí)會(huì)收到 DBA 的郵件,里面列出了我們項(xiàng)目上幾個(gè)耗時(shí)比較長(zhǎng)的查詢語(yǔ)句,讓我們?nèi)?yōu)化,這些語(yǔ)句是從哪里來(lái)的呢?
我們的服務(wù)層每天執(zhí)行了這么多 SQL 語(yǔ)句,它怎么知道哪些 SQL 語(yǔ)句比較慢呢?
第一步,我們要把 SQL 執(zhí)行情況記錄下來(lái)。
1.1 慢查詢?nèi)罩?slow query log
1.1.1 打開(kāi)慢日志開(kāi)關(guān)
因?yàn)殚_(kāi)啟慢查詢?nèi)罩臼怯写鷥r(jià)的(跟 bin log、optimizer-trace 一樣),所以它默認(rèn)是關(guān)閉的:
show variables like 'slow_query%';
除了這個(gè)開(kāi)關(guān),還有一個(gè)參數(shù),控制執(zhí)行超過(guò)多長(zhǎng)時(shí)間的 SQL 才記錄到慢日志,默認(rèn)是 10 秒。
show variables like '%slow_query%';
可以直接動(dòng)態(tài)修改參數(shù)(重啟后失效)。
set @@global.slow_query_log=1;
set @@global.long_query_time=3;
?show variables like '%long_query%';-- 1 開(kāi)啟, 0 關(guān)閉, 重啟后失效
-- mysql 默認(rèn)的慢查詢時(shí)間是 10 秒, 另開(kāi)一個(gè)窗口后才會(huì)查到最新值
show variables like '%slow_query%';
或者修改配置文件 my.cnf。
以下配置定義了慢查詢?nèi)罩镜拈_(kāi)關(guān)、慢查詢的時(shí)間、日志文件的存放路徑。
slow_query_log = ON
long_query_time=2
slow_query_log_file =/var/lib/mysql/localhost-slow.log
模擬慢查詢:
select sleep(10);
查詢 user_innodb 表的 500 萬(wàn)數(shù)據(jù)(檢查是不是沒(méi)有索引)。
SELECT * FROM `user_innodb` where phone = '136';
4.1.2 慢日志分析
1、 日志內(nèi)容
show global status like 'slow_queries'; -- 查看有多少慢查詢
show variables like '%slow_query%'; -- 獲取慢日志目錄
--日志路徑
cat /var/lib/mysql/ localhost-slow.log日志內(nèi)容有了慢查詢?nèi)罩?#xff0c;怎么去分析統(tǒng)計(jì)呢?
比如 SQL 語(yǔ)句的出現(xiàn)的慢查詢次數(shù)最多,平均每次執(zhí)行了多久?
2、 mysqldumpslow
MySQL 提供了 mysqldumpslow 的工具,在 MySQL 的 bin 目錄下。
mysqldumpslow --help
例如:查詢用時(shí)最多的 20 條慢 SQL:
mysqldumpslow -s t -t 20 -g 'select' /var/lib/mysql/localhost-slow.log
Count代表這個(gè) SQL 執(zhí)行了多少次;
Time代表執(zhí)行的時(shí)間,括號(hào)里面是累計(jì)時(shí)間;
Lock表示鎖定的時(shí)間,括號(hào)是累計(jì);
Rows表示返回的記錄數(shù),括號(hào)是累計(jì)。
除了慢查詢?nèi)罩局?#xff0c;還有一個(gè)SHOW PROFILE 工具可以使用。
4.2 SHOW PROFILE
SHOW PROFILE 是谷歌高級(jí)架構(gòu)師 Jeremy Cole 貢獻(xiàn)給 MySQL 社區(qū)的,可以查看SQL 語(yǔ)句執(zhí)行的時(shí)候使用的資源,比如 CPU、IO 的消耗情況。
在 SQL 中輸入 help profile 可以得到詳細(xì)的幫助信息。
4.2.1 查看是否開(kāi)啟
select @@profiling;
set @@profiling=1;
4.2.2 查看 profile 統(tǒng)計(jì)
(命令最后帶一個(gè) s)
show profiles;
查看最后一個(gè) SQL 的執(zhí)行詳細(xì)信息,從中找出耗時(shí)較多的環(huán)節(jié)(沒(méi)有 s)。
show profile;
6.2E-5,小數(shù)點(diǎn)左移 5 位,代表 0.000062 秒。
也可以根據(jù) ID 查看執(zhí)行詳細(xì)信息,在后面帶上 for query + ID。
show profile for query 1;
除了慢日志和 show profile,如果要分析出當(dāng)前數(shù)據(jù)庫(kù)中執(zhí)行的慢的 SQL,還可以通過(guò)查看運(yùn)行線程狀態(tài)和服務(wù)器運(yùn)行信息、存儲(chǔ)引擎信息來(lái)分析。
4.2.3 其他系統(tǒng)命令
show processlist 運(yùn)行線程
show processlist;
這是很重要的一個(gè)命令,用于顯示用戶運(yùn)行線程。可以根據(jù) id 號(hào) kill 線程。 也可以查表,效果一樣:
select * from information_schema.processlist;
show status 服務(wù)器運(yùn)行狀態(tài)
SHOW STATUS 用于查看 MySQL 服務(wù)器運(yùn)行狀態(tài)(重啟后會(huì)清空),有 session和 global 兩種作用域,格式:參數(shù)-值。
可以用 like 帶通配符過(guò)濾。
SHOW GLOBAL STATUS LIKE 'com_select'; -- 查看 select 次數(shù)
show engine 存儲(chǔ)引擎運(yùn)行信息
show engine 用來(lái)顯示存儲(chǔ)引擎的當(dāng)前運(yùn)行信息,包括事務(wù)持有的表鎖、行鎖信息;事務(wù)的鎖等待情況;線程信號(hào)量等待;文件 IO 請(qǐng)求;buffer pool 統(tǒng)計(jì)信息。
例如:
show engine innodb status;
如果需要將監(jiān)控信息輸出到錯(cuò)誤信息 error log 中(15 秒鐘一次),可以開(kāi)啟輸出。
show variables like 'innodb_status_output%';
-- 開(kāi)啟輸出:
SET GLOBAL innodb_status_output=ON;
SET GLOBAL innodb_status_output_locks=ON;
我們現(xiàn)在已經(jīng)知道了這么多分析服務(wù)器狀態(tài)、存儲(chǔ)引擎狀態(tài)、線程運(yùn)行信息的命令,如果讓你去寫(xiě)一個(gè)數(shù)據(jù)庫(kù)監(jiān)控系統(tǒng),你會(huì)怎么做?
其實(shí)很多開(kāi)源的慢查詢?nèi)罩颈O(jiān)控工具,他們的原理其實(shí)也都是讀取的系統(tǒng)的變量和狀態(tài)。
現(xiàn)在我們已經(jīng)知道哪些 SQL 慢了,為什么慢呢?慢在哪里?
MySQL 提供了一個(gè)執(zhí)行計(jì)劃的工具(在架構(gòu)中我們有講到,優(yōu)化器最終生成的就是一個(gè)執(zhí)行計(jì)劃),其他數(shù)據(jù)庫(kù),例如 Oracle 也有類似的功能。
通過(guò) EXPLAIN 我們可以模擬優(yōu)化器執(zhí)行 SQL 查詢語(yǔ)句的過(guò)程,來(lái)知道 MySQL 是
怎么處理一條 SQL 語(yǔ)句的。通過(guò)這種方式我們可以分析語(yǔ)句或者表的性能瓶頸。
explain 可以分析 update、delete、insert 么?
MySQL 5.6.3以前只能分析 SELECT;
MySQL5.6.3以后就可以分析update、delete、insert 了。
我們將在下一篇文章為大家?guī)?lái)EXPLAIN 執(zhí)行計(jì)劃詳解。
深入精通Mysql系列其他文章推薦:
總結(jié)
以上是生活随笔為你收集整理的Mysql慢查询深入剖析_《深入精通Mysql(六)》系列之如何通过慢查询日志进行SQL分析和优化...的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: mysql三台机群集_MySQL Clu
- 下一篇: visual MySQL 教程_Visu