日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 运维知识 > 数据库 >内容正文

数据库

Mysql慢查询深入剖析_《深入精通Mysql(六)》系列之如何通过慢查询日志进行SQL分析和优化...

發(fā)布時(shí)間:2024/9/30 数据库 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Mysql慢查询深入剖析_《深入精通Mysql(六)》系列之如何通过慢查询日志进行SQL分析和优化... 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

深入精通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)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。