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

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

生活随笔

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

数据库

MySQL优化—工欲善其事,必先利其器(2)

發(fā)布時(shí)間:2023/12/20 数据库 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 MySQL优化—工欲善其事,必先利其器(2) 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

http://www.cnblogs.com/magialmoon/p/3472804.html點(diǎn)擊打開(kāi)鏈接

上一篇文章簡(jiǎn)單介紹了下EXPLAIN的用法,今天主要介紹以下幾點(diǎn)內(nèi)容:

慢查詢(xún)?nèi)罩?/p>

  • 打開(kāi)慢查詢(xún)?nèi)罩?/li>
  • 保存慢查詢(xún)?nèi)罩镜奖碇?/li>
  • 慢查詢(xún)?nèi)罩痉治?/li>

Percona Toolkit介紹

  • 安裝
  • pt-query-digest
  • pt-index-usage
  • pt-query-advisor

SHOW PROFILE

performance_schema

?

慢查詢(xún)?nèi)罩?/h1>

打開(kāi)慢查詢(xún)?nèi)罩?/h2>

慢查詢(xún)?nèi)罩?#xff0c;顧名思義就是記錄執(zhí)行比較慢查詢(xún)的日志。

查看是否開(kāi)啟慢查詢(xún)?nèi)罩?#xff1a;

show variables like '%slow%';

打開(kāi)慢查詢(xún)?nèi)罩尽P薷腗ySQL的配置文件my.cn一般是在/etc目錄下面,加上下面三行配置后重啟MySQL。

slow_query_log = ON slow_launch_time = 2 slow_query_log_file = /usr/local/mysql/data/slow_query.log

slow_launch_time只能精確到秒,如果需要更精確可以使用一些第三方的工具比如后面介紹的pt-query-digest。

注意:我這里用的MySQL版本是5.6,不同版本的MySQL開(kāi)啟慢查詢(xún)的配置是不同的,比如5.6之前的某些版本是ong_query_time, long_query_time和log-slow-queries。可以先在終端執(zhí)行show variables like '%slow%';查看下當(dāng)前版本具體配置是什么。

也可以在終端通過(guò)設(shè)置全局變量來(lái)打開(kāi)慢查詢(xún)?nèi)罩?#xff1a;

set @@global.slow_query_log = ON;

保存慢查詢(xún)?nèi)罩镜奖碇?/h2>

MySQL支持將慢查詢(xún)?nèi)罩颈4娴絤ysql.slow_log這張表中。通過(guò)@@global.log_output可以設(shè)置默認(rèn)為T(mén)ABLE,FILE和TABLE只能同時(shí)使用一個(gè)。

set @@global.log_output='TABLE';

我們可以使用下面的語(yǔ)句來(lái)模擬慢查詢(xún):

select sleep(10);

慢查詢(xún)?nèi)罩痉治?/h2>

1、可以使用MySQL自帶的mysqldumpslow工具。使用很簡(jiǎn)單,可以跟-help來(lái)查看具體的用法。

# -s:排序方式。c , t , l , r 表示記錄次數(shù)、時(shí)間、查詢(xún)時(shí)間的多少、返回的記錄數(shù)排序; # ac , at , al , ar 表示相應(yīng)的倒敘; # -t:返回前面多少條的數(shù)據(jù); # -g:包含什么,大小寫(xiě)不敏感的; mysqldumpslow -s r -t 10 /slowquery.log #slow記錄最多的10個(gè)語(yǔ)句 mysqldumpslow -s t -t 10 -g "left join" /slowquery.log #按照時(shí)間排序前10中含有"left join"

2、可以導(dǎo)到mysql.slow_query表中,然后通過(guò)sql語(yǔ)句進(jìn)行分析。

3、使用第三方工具,下面會(huì)有介紹。

?

Percona Toolkit介紹

percona-toolkit是一組高級(jí)命令行工具的集合,用來(lái)執(zhí)行各種通過(guò)手工執(zhí)行非常復(fù)雜和麻煩的mysql和系統(tǒng)任務(wù)。這些任務(wù)包括:

  • 檢查master和slave數(shù)據(jù)的一致性
  • 有效地對(duì)記錄進(jìn)行歸檔
  • 查找重復(fù)的索引
  • 對(duì)服務(wù)器信息進(jìn)行匯總
  • 分析來(lái)自日志和tcpdump的查詢(xún)
  • 當(dāng)系統(tǒng)出問(wèn)題的時(shí)候收集重要的系統(tǒng)信息

安裝

安裝percona-toolkit非常簡(jiǎn)單,到官網(wǎng)下載.tar.gz包:

wget percona.com/get/percona-toolkit.tar.gz tar -zxvf percona-toolkit-2.2.5.tar.gz

然后依次執(zhí)行下面的命令:

perl Makefile.PL make make test make install

默認(rèn)的會(huì)被安裝在/usr/local/bin目錄下。執(zhí)行man percona-toolkit可以查看安裝了哪些工具。

運(yùn)行工具可能會(huì)遇到下面的錯(cuò)誤:

這是因?yàn)槿鄙傧鄳?yīng)包,.pm包實(shí)際上perl的包,運(yùn)行下面的命令安裝即可:

yum install -y perl-Time-HiRes

如果安裝過(guò)程中出現(xiàn)” Error Downloading Packages”錯(cuò)誤,嘗試yum clean all后再安裝。使用其Percona Toolkit中其他工具也可能會(huì)遇到類(lèi)似的問(wèn)題,按照提示安裝相應(yīng)的perl包就可以了。

Percona Toolkit整個(gè)工具箱提供了非常多實(shí)用的工具,具體的使用方法可以參看官方文檔。

下面有選擇的給大家介紹幾個(gè)有用的工具。

pt-query-digest

pt-query-digest可以從普通MySQL日志,慢查詢(xún)?nèi)罩疽约岸M(jìn)制日志中分析查詢(xún),甚至可以從SHOW PROCESSLIST和MySQL協(xié)議的tcpdump中進(jìn)行分析,如果沒(méi)有指定文件,它從標(biāo)準(zhǔn)輸入流(STDIN)中讀取數(shù)據(jù)。

最簡(jiǎn)單的用法如下:

pt-query-digest slow.logs

輸出信息大致如下:

整個(gè)輸出分為三大部分:

1、整體概要(Overall)

這個(gè)部分是一個(gè)大致的概要信息(類(lèi)似loadrunner給出的概要信息),通過(guò)它可以對(duì)當(dāng)前MySQL的查詢(xún)性能做一個(gè)初步的評(píng)估,比如各個(gè)指標(biāo)的最大值(max),平均值(min),95%分布值,中位數(shù)(median),標(biāo)準(zhǔn)偏差(stddev)。這些指標(biāo)有查詢(xún)的執(zhí)行時(shí)間(Exec time),鎖占用的時(shí)間(Lock time),MySQL執(zhí)行器需要檢查的行數(shù)(Rows examine),最后返回給客戶(hù)端的行數(shù)(Rows sent),查詢(xún)的大小。

2、查詢(xún)的匯總信息(Profile)

這個(gè)部分對(duì)所有”重要”的查詢(xún)(通常是比較慢的查詢(xún))做了個(gè)一覽表:

每個(gè)查詢(xún)都有一個(gè)Query ID,這個(gè)ID通過(guò)Hash計(jì)算出來(lái)的。pt-query-digest是根據(jù)這個(gè)所謂的Fingerprint來(lái)group by的。舉例下面兩個(gè)查詢(xún)的Fingerprint是一樣的都是select * from table1 where column1 = ?,工具箱中也有一個(gè)與之相關(guān)的工具pt-fingerprint。

select * from table1 where column1 = 2 select * from table1 where column1 = 3
  • Rank整個(gè)分析中該“語(yǔ)句”的排名,一般也就是性能最常的。
  • Response time? “語(yǔ)句”的響應(yīng)時(shí)間以及整體占比情況。
  • Calls 該“語(yǔ)句”的執(zhí)行次數(shù)。
  • R/Call 每次執(zhí)行的平均響應(yīng)時(shí)間。
  • V/M 響應(yīng)時(shí)間的差異平均對(duì)比率。

在尾部有一行輸出,顯示了其他2個(gè)占比較低而不值得單獨(dú)顯示的查詢(xún)的統(tǒng)計(jì)數(shù)據(jù)。

3、詳細(xì)信息

這個(gè)部分會(huì)列出Profile表中每個(gè)查詢(xún)的詳細(xì)信息:

包括Overall中有的信息、查詢(xún)響應(yīng)時(shí)間的分布情況以及該查詢(xún)”入榜”的理由。

pt-query-digest還有很多復(fù)雜的操作,這里就不一一介紹了。比如:從PROCESSLIST中查詢(xún)某個(gè)MySQL中最慢的查詢(xún):

pt-query-digest –processlist h=host1

從tcpdump中分析:

tcpdump -s 65535 -x -nn -q -tttt -i any -c 1000 port 3306 > mysql.tcp.txt pt-query-digest --type tcpdump mysql.tcp.txt

從一臺(tái)機(jī)器上講slow log保存到另外一臺(tái)機(jī)器上待稍后詳細(xì)分析:

pt-query-digest --review h=host2 --no-report slow.log

還可以跟一些過(guò)濾條件。詳見(jiàn)官方文檔:http://www.percona.com/doc/percona-toolkit/2.2/pt-query-digest.html

另外結(jié)合一些第三方工具還能生成相應(yīng)的報(bào)表,可以參考這里:http://biancheng.dnbcw.info/mysql/433514.html

建議:當(dāng)slow log很大的時(shí)候最好還是將日志文件移到其他機(jī)器上進(jìn)行分析。

?

pt-index-usage

這個(gè)工具主要是用來(lái)分析查詢(xún)的索引使用情況。

pt-index-usage slow_query.log --h localhost --password 123456

詳細(xì)的用法 –help查看再對(duì)照官網(wǎng)就差不再贅述。

注意使用這個(gè)工具需要MySQL必須要有密碼,另外運(yùn)行時(shí)可能報(bào)找不到/var/lib/mysql/mysql.sock的錯(cuò),簡(jiǎn)單的從/tmp/mysql.sock鏈接一個(gè)就行了。

重點(diǎn)要說(shuō)明的是pt-index-usage只能分析慢查詢(xún)?nèi)罩?#xff0c;所以如果想全面分析所有查詢(xún)的索引使用情況就得將slow_launch_time設(shè)置為0,因此請(qǐng)謹(jǐn)慎使用該工具,線上使用的話最好在凌晨進(jìn)行分析,尤其分析大量日志的時(shí)候是很耗CPU的。

整體來(lái)說(shuō)這個(gè)工具是不推薦使用的,要想實(shí)現(xiàn)類(lèi)似的分析可以考慮一些其他第三方的工具,比如:mysqlidxchx, userstat和check-unused-keys。網(wǎng)上比較推薦的是userstat,一個(gè)Google貢獻(xiàn)的patch。

Oracle是可以將執(zhí)行計(jì)劃保存到性能視圖中的,這樣分析起來(lái)可能更靈活,但是目前我還沒(méi)找到MySQL中類(lèi)似的做法。

?

pt-upgrade

這個(gè)工具用來(lái)檢查在新版本中運(yùn)行的SQL是否與老版本一樣,返回相同的結(jié)果,最好的應(yīng)用場(chǎng)景就是數(shù)據(jù)遷移的時(shí)候。

pt-upgrade h=host1 h=host2 slow.log

?

pt-query-advisor?

靜態(tài)查詢(xún)分析工具。能夠解析查詢(xún)?nèi)罩尽⒎治霾樵?xún)模式,然后給出所有可能存在潛在問(wèn)題的查詢(xún),并給出足夠詳細(xì)的建議。這個(gè)工具好像2.2的版本給去掉了,有可能是因?yàn)閷?duì)性能影響比較大新版本直接去掉了。

總結(jié):上面這些工具最好不要直接在線上使用,應(yīng)該作為上線輔助或故障后離線分析的工具,也可以做性能測(cè)試的時(shí)候配合著使用。

?

SHOW PROFILE

SHOW PROFILE是Google高級(jí)架構(gòu)師Jeremy Cole貢獻(xiàn)給MySQL社區(qū)的,它可以用來(lái)MySQL執(zhí)行語(yǔ)句時(shí)候所使用的資源。默認(rèn)是關(guān)閉的,需要打開(kāi)執(zhí)行下面的語(yǔ)句:

set profiling = 1;#這個(gè)命令只在本會(huì)話內(nèi)起作用。

執(zhí)行簡(jiǎn)單的SHOW PROFILES可以看到打開(kāi)profiling之后所有查詢(xún)的執(zhí)行時(shí)間。

執(zhí)行SHOW PROFILE [TYPE] FOR QUERY Query_ID可以看到MySQL執(zhí)行某個(gè)查詢(xún)各個(gè)步驟的各項(xiàng)性能指標(biāo)的詳細(xì)信息:

如果沒(méi)有指定FOR QUERY則顯示最近一條查詢(xún)的詳細(xì)信息。TYPE是可選的,有以下幾個(gè)選項(xiàng):

  • ALL 顯示所有性能信息
  • BLOCK IO 顯示塊IO操作的次數(shù)
  • CONTEXT SWITCHES 顯示上下文切換次數(shù),不管是主動(dòng)還是被動(dòng)
  • CPU 顯示用戶(hù)CPU時(shí)間、系統(tǒng)CPU時(shí)間
  • IPC 顯示發(fā)送和接收的消息數(shù)量
  • MEMORY [暫未實(shí)現(xiàn)]
  • PAGE FAULTS 顯示頁(yè)錯(cuò)誤數(shù)量
  • SOURCE 顯示源碼中的函數(shù)名稱(chēng)與位置
  • SWAPS 顯示SWAP的次數(shù)

MySQL在執(zhí)行查詢(xún)語(yǔ)句的時(shí)候會(huì)有很多步驟,這里就不一一贅述了,用到的時(shí)候網(wǎng)上搜下就行。需要特別說(shuō)明的是Sending data這個(gè)步驟,給人感覺(jué)是MySQL把數(shù)據(jù)發(fā)送給客戶(hù)端的耗時(shí),其實(shí)不然,這個(gè)步驟包括了MySQL內(nèi)部各個(gè)存儲(chǔ)之間復(fù)制數(shù)據(jù)的過(guò)程,比如硬盤(pán)的尋道。

總結(jié):前面的慢查詢(xún)?nèi)罩痉治龈袷菍?duì)整個(gè)MySQL查詢(xún)情況做一個(gè)全面的檢查,而SHOW PROFILE則是對(duì)單個(gè)查詢(xún)語(yǔ)句的剖析,通常當(dāng)現(xiàn)網(wǎng)出現(xiàn)問(wèn)題時(shí)應(yīng)該結(jié)合二者。使用慢查詢(xún)分析定位到具體的查詢(xún),使用SHOW PROFILE定位到具體的問(wèn)題,是Sending data比較耗時(shí)還是System lock比較耗時(shí)...

?

performance_schema

這兩個(gè)庫(kù)保存了MySQL的一些性能和元數(shù)據(jù)相關(guān)的信息,其中performance_schema是MySQL5.5才新增的,上面提到的很多工具其實(shí)利用了這個(gè)庫(kù)的信息。比如SHOW PROFILE ALL FOR QUERY 2:的信息還可以通過(guò)下面的查詢(xún)獲取:

SELECT * FROM information_schema.profiling WHERE query_id = 2 ORDER BY seq;

利用performance_schema還可以做一些更靈活的統(tǒng)計(jì):

SET @query_id = 1; SELECT STATE,SUM(DURATION) AS Total_R,ROUND(100*SUM(DURATION)/(SELECT SUM(DURATION) FROM INFORMATION_SCHEMA.PROFILINGWHERE QUERY_ID = @query_id),2) AS Pct_R,COUNT(*) AS Calls,SUM(DURATION)/COUNT(*) AS "R/Call" FROM INFORMATION_SCHEMA.PROFILING WHERE QUERY_ID = @query_id GROUP BY STATE ORDER BY Total_R DESC;

這個(gè)簡(jiǎn)單的查詢(xún)可以在《高性能MySQL第三版》中找到,可它能統(tǒng)計(jì)SHOW PROFILE各個(gè)步驟的耗時(shí)、耗時(shí)占比、調(diào)用API次數(shù)以及每次的平均耗時(shí)。在《高性能MySQL第三版》中還提到了很多有用的工具(SHOW STATUS,SHOW PROCESSLIST...)包括使用方法,強(qiáng)烈推薦這本書(shū)。

?

Ok,今天的介紹就到這里,這兩篇文章的主要目的是希望自己在發(fā)現(xiàn)問(wèn)題的時(shí)候可以知道從何下手,也希望能夠大家?guī)?lái)一些實(shí)用價(jià)值。下一篇準(zhǔn)備介紹一下MySQL執(zhí)行語(yǔ)句的一些基本原理,俗話說(shuō)磨刀不誤砍柴工嘛!



總結(jié)

以上是生活随笔為你收集整理的MySQL优化—工欲善其事,必先利其器(2)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

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