mysql慢查詢?nèi)罩?/h1>

前提環(huán)境:

  • 創(chuàng)庫:slow_testcreate database slow_test;
  • 選定庫:use slow_test;
  • 創(chuàng)表comic:create table comic(comic_id int primary key auto_increment,name char(20),pen_name char(20),cover char(40));
    image.png
delimiter  //

create procedure insert_many()
begin
declare i int;
set i =0;
while i<10 do
insert into comic (name,pen_name,cover) select name,pen_name,cover from comic;
set i=i+1;
end while;
end;
//

delimiter ;
image.png
image.png
image.png
image.png

一鸽凶、生成實驗數(shù)據(jù)

原理:sql 蠕蟲復(fù)制(這種生成數(shù)據(jù)方式同樣適用于數(shù)據(jù)表中有主鍵的情況)。

insert into comic (name,pen_name,cover) select name,pen_name,cover from comic

二原探、慢查詢?nèi)罩驹O(shè)置

當(dāng)語句執(zhí)行時間較長時耘纱,通過日志的方式進行記錄震贵,這種方式就是慢查詢的日志擎宝。

  • 1、臨時開啟慢查詢?nèi)罩荆ㄈ绻枰L時間開啟涡上,則需要更改mysql配置文件趾断,第6點有介紹)
set global slow_query_log = on; 

注:如果想關(guān)閉慢查詢?nèi)罩荆恍枰獔?zhí)行 set global slow_query_log = off; 即可


image.png
  • 2吩愧、臨時設(shè)置慢查詢時間臨界點 查詢時間高于這個臨界點的都會被記錄到慢查詢?nèi)罩局校ㄈ绻枰L時間開啟芋酌,則需要更改mysql配置文件,第6點有介紹)雁佳。
set long_query_time = 1;
image.png

現(xiàn)在起脐帝,所有執(zhí)行時間超過1秒的sql都將被記錄到慢查詢文件中
(我這里就是 /var/lib/mysql/oyzx-slow.log)同云。
set long_query_time = 1;
show variables like 'slow_query%'; #查看慢日志文件所在目錄

image.png

  • 3、設(shè)置慢查詢存儲的方式
set global log_output='FILE';

image.png

說明:可以看到,我這里設(shè)置為了file類型,就是說我的慢查詢?nèi)罩臼峭ㄟ^file體現(xiàn)的,默認是none,我們可以設(shè)置為table或者file,如果是table則慢查詢信息會保存到mysql庫下的slow_log表中
set global log_output='TABLE';

  • 4堵腹、查詢慢查詢?nèi)罩镜拈_啟狀態(tài)和慢查詢?nèi)罩緝Υ娴奈恢?/li>
show variables like '%quer%';
image.png

image.png

參數(shù)說明:
slow_query_log : 是否已經(jīng)開啟慢查詢
slow_query_log_file : 慢查詢?nèi)罩疚募窂?br> long_query_time : 超過多少秒的查詢就寫入日志
log_queries_not_using_indexes 如果值設(shè)置為ON炸站,則會記錄所有沒有利用索引的查詢(性能優(yōu)化時開啟此項,平時不要開啟)

  • 5、使用慢查詢?nèi)罩臼纠?/li>
cat -n /var/lib/mysql/oyzx-slow.log
image.png

從慢查詢?nèi)罩局芯吻辏覀兛梢钥吹矫恳粭l查詢時間高于1s鐘的sql語句旱易,并可以看到執(zhí)行的時間是多少。

比如上面荡含,就表示 sql語句 select * from comic; 執(zhí)行時間為3.30秒咒唆,超出了我們設(shè)置的慢查詢時間臨界點1s,所以被記錄下來了释液。

image.png

image.png
  • 6全释、永久設(shè)置慢查詢?nèi)罩鹃_啟,以及設(shè)置慢查詢?nèi)罩緯r間臨界點
    linux中误债,mysql配置文件一般默認在/etc/my.cnf
    更改對應(yīng)參數(shù)即可浸船。
    image.png

    systemctl restart mysqld 重啟mysql服務(wù)
    image.png
image.png
image.png

三、對慢查詢?nèi)罩具M行分析

我們通過查看慢查詢?nèi)罩究梢园l(fā)現(xiàn)寝蹈,很亂李命,數(shù)據(jù)量大的時候,可能一天會產(chǎn)生幾個G的日志箫老,根本沒有辦法去清晰明了的分析封字。所以,這里耍鬓,我們采用工具進行分析阔籽。

  • 1、使用mysqldumpslow進行分析【第一種方式】
mysqldumpslow -t 10  /var/lib/mysql/oyzx-slow.log   #顯示出慢查詢?nèi)罩局凶盥?0條sql
image.png

注:mysqldumpslow工具還有其他參數(shù)牲蜀,以提供其他功能笆制,這里,只以最基本的-t做了介紹涣达。

  • 2在辆、使用pt-query-digest工具進行分析

mysqldumpslow是mysql安裝后就自帶的工具,用于分析慢查詢?nèi)罩径忍Γ莗t-query-digest卻不是mysql自帶的匆篓,如果想使用pt-query-digest進行慢查詢?nèi)罩镜姆治觯瑒t需要自己安裝pt-query-digest寇窑。pt-query-digest工具相較于mysqldumpslow功能多一點奕删。

(1)安裝及部署

yum install perl-DBI

yum install perl-DBD-MySQL

yum install perl-Time-HiRes

yum install perl-IO-Socket-SSL

yum -y install perl-Digest-MD5

wget percona.com/get/pt-query-digest

chmod u+x pt-query-digest

mv pt-query-digest /usr/bin/

(2)查看具體參數(shù)作用

pt-query-digest --help
image.png

(3)使用

pt-query-digest /var/lib/mysql/oyzx-slow.log

查詢出來的結(jié)果分為三部分

  • 第一部分:
    顯示出了日志的時間范圍,以及總的sql數(shù)量和不同的sql數(shù)量疗认。

    image.png

  • 第二部分:
    顯示出統(tǒng)計信息完残。

    image.png

第三部分:
每一個sql具體的分析

image.png

image.png

pct是percent的簡寫伏钠,表示占的百分比
cout是占總sql個數(shù)的百分比,
exec time 是占總執(zhí)行時間的百分比谨设,
lock time表示占總的鎖表時間的百分比熟掂。

  • (4)如何通過pt-query-digest 慢查詢?nèi)罩景l(fā)現(xiàn)有問題的sql

1)查詢次數(shù)多且每次查詢占用時間長的sql

通常為pt-query-digest分析的前幾個查詢

2)IO消耗大的sql

注意pt-query-digest分析中的Rows examine項

3)為命中索引的sql

注意pt-query-digest分析中Rows examine(掃描行數(shù)) 和 Rows sent (發(fā)送行數(shù))的對比 ,如果掃描行數(shù)遠遠大于發(fā)送行數(shù)扎拣,則說明索引命中率并不高赴肚。

四、對sql進行優(yōu)化

  • 1二蓝、使用explain查詢sql的執(zhí)行計劃
explain select comic_id,name,pen_name,cover,last_verify_time from comic;

參數(shù)分析:

table:表示屬于哪張數(shù)據(jù)表

type:最重要的參數(shù)誉券,表示連接使用了何種類型。從最好到最差的連接類型為const刊愚,eq_reg踊跟,ref,range鸥诽,index和ALL商玫。

possible_keys:顯示可能應(yīng)用在這張表中的索引。如果為null牡借,則表示沒有可能的索引拳昌。

key:實際使用的索引。如果為null钠龙,則表示沒有使用索引炬藤。

key_len:使用的索引的長度,在不損失精確性的情況下碴里,長度越短越好沈矿。

ref:表示索引的哪一列被使用了,如果可能的話并闲,是一個常數(shù)。

rows:Mysql認為必須檢查的用來返回請求數(shù)據(jù)的行數(shù)谷羞。

  • 2帝火、count() 和 Max() 的優(yōu)化方法

(1)優(yōu)化前,是沒有為last_update_time字段建立索引的情況湃缎,查詢最大的時間戳
(2)優(yōu)化后犀填,是為last_update_time字段建立索引的情況,查詢最大的時間戳

create index update_time on comic(last_update_time);

對比嗓违,可以看到九巡,在沒有為字段建立索引的情況下,查詢時間是11秒多蹂季,建立索引之后冕广,查詢時間變成0秒了疏日。

所以總結(jié)就是,如果經(jīng)常用于count和max操作的字段撒汉,可以為其添加索引沟优。

還有,值得注意的地方是:count() 計算時睬辐,count(*)會將這一列中的null值但也算進去挠阁,而count(comic_id)則不會將null算進去。

  • 3溯饵、子查詢的優(yōu)化

通常情況下侵俗,需要把子查詢優(yōu)化為join查詢,但在優(yōu)化時要注意關(guān)聯(lián)鍵是否有一對多的關(guān)系丰刊,如果有隘谣,是可能會出現(xiàn)重復(fù)數(shù)據(jù)的。所以如果存在一對多關(guān)系藻三,則應(yīng)該使用distinct進行限制洪橘。
例如:

select t.id from t where t.id in (select k.kid from k);

優(yōu)化成:

select distinct t.id from t join k on t.id = k.kid;
  • 4、group by 的優(yōu)化

待補

5棵帽、limit的優(yōu)化

五熄求、對索引進行優(yōu)化

1、選擇合適的列建立索引

2逗概、索引優(yōu)化sql的方法

3弟晚、索引維護的方法

六、數(shù)據(jù)庫結(jié)構(gòu)優(yōu)化

1逾苫、選擇合適的數(shù)據(jù)類型

2卿城、數(shù)據(jù)庫表的范式化優(yōu)化

3、數(shù)據(jù)庫表的反范式優(yōu)化

4铅搓、數(shù)據(jù)庫表的垂直拆分

5瑟押、數(shù)據(jù)庫表的水平拆分

七、系統(tǒng)配置優(yōu)化
1星掰、數(shù)據(jù)庫系統(tǒng)配置優(yōu)化

2多望、Mysql配置文件優(yōu)化

3、第三方配置工具使用

八氢烘、服務(wù)器硬件優(yōu)化

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者

  • 序言:七十年代末怀偷,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子播玖,更是在濱河造成了極大的恐慌椎工,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,454評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異维蒙,居然都是意外死亡掰吕,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,553評論 3 385
  • 文/潘曉璐 我一進店門木西,熙熙樓的掌柜王于貴愁眉苦臉地迎上來畴栖,“玉大人,你說我怎么就攤上這事八千÷鹧龋” “怎么了?”我有些...
    開封第一講書人閱讀 157,921評論 0 348
  • 文/不壞的土叔 我叫張陵恋捆,是天一觀的道長照皆。 經(jīng)常有香客問我,道長沸停,這世上最難降的妖魔是什么膜毁? 我笑而不...
    開封第一講書人閱讀 56,648評論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮愤钾,結(jié)果婚禮上瘟滨,老公的妹妹穿的比我還像新娘。我一直安慰自己能颁,他們只是感情好杂瘸,可當(dāng)我...
    茶點故事閱讀 65,770評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著伙菊,像睡著了一般败玉。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上镜硕,一...
    開封第一講書人閱讀 49,950評論 1 291
  • 那天运翼,我揣著相機與錄音,去河邊找鬼兴枯。 笑死血淌,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的财剖。 我是一名探鬼主播悠夯,決...
    沈念sama閱讀 39,090評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼峰伙!你這毒婦竟也來了疗疟?” 一聲冷哼從身側(cè)響起该默,我...
    開封第一講書人閱讀 37,817評論 0 268
  • 序言:老撾萬榮一對情侶失蹤瞳氓,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體匣摘,經(jīng)...
    沈念sama閱讀 44,275評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡店诗,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,592評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了音榜。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片庞瘸。...
    茶點故事閱讀 38,724評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖赠叼,靈堂內(nèi)的尸體忽然破棺而出擦囊,到底是詐尸還是另有隱情,我是刑警寧澤嘴办,帶...
    沈念sama閱讀 34,409評論 4 333
  • 正文 年R本政府宣布瞬场,位于F島的核電站,受9級特大地震影響涧郊,放射性物質(zhì)發(fā)生泄漏贯被。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 40,052評論 3 316
  • 文/蒙蒙 一妆艘、第九天 我趴在偏房一處隱蔽的房頂上張望彤灶。 院中可真熱鬧,春花似錦批旺、人聲如沸幌陕。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,815評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽尿背。三九已至,卻和暖如春籍嘹,著一層夾襖步出監(jiān)牢的瞬間吕嘀,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,043評論 1 266
  • 我被黑心中介騙來泰國打工翎卓, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留契邀,地道東北人。 一個月前我還...
    沈念sama閱讀 46,503評論 2 361
  • 正文 我出身青樓失暴,卻偏偏與公主長得像坯门,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子逗扒,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,627評論 2 350

推薦閱讀更多精彩內(nèi)容