MySQL性能優(yōu)化-使用explain查詢和分析語(yǔ)句

在mysql數(shù)據(jù)庫(kù)中為我們提供了explain方法可以通過它來(lái)幫助我們分析我們的sql語(yǔ)句瓶殃。

explain select * from customer;

例子.jpg

explain參數(shù)說(shuō)明

select_type:select語(yǔ)句的類型,主要包括

SIMPLE:簡(jiǎn)單SELECT(不使用UNION或子查詢)
PRIMARY:最外面的SELECT
UNION:UNION中的第二個(gè)或后面的SELECT語(yǔ)句
DEPENDENT UNION:UNION中的第二個(gè)或后面的SELECT語(yǔ)句,取決于外面的查詢
UNION RESULT:UNION 的結(jié)果
SUBQUERY:子查詢中的第一個(gè)SELECT
DEPENDENT SUBQUERY:子查詢中的第一個(gè)SELECT,取決于外面的查詢
DERIVED:導(dǎo)出表的SELECT(FROM子句的子查詢)

table:查詢的表

possible_keys:指出MySQL能使用哪個(gè)索引在該表中找到行

key:顯示MySQL實(shí)際決定使用的鍵(索引)。如果沒有選擇索引,鍵是NULL
key_len:使用索引的長(zhǎng)度

type:聯(lián)接類型。這個(gè)參數(shù)很重要稠炬。下面給出比較常用的幾種連接類型:

const:常數(shù)查找房待,如:主鍵践盼,唯一索引思瘟,會(huì)很快,因?yàn)樗鼈冎蛔x取一次!
eq_ref:對(duì)于每個(gè)來(lái)自于前面的表的行組合,從該表中讀取一行。這可能是最好的聯(lián)接類型,除了const類型剩拢。
ref:基于連接的查找
range:基于索引的范圍查找
index:基于索引的掃描线得。該聯(lián)接類型與ALL相同,除了只有索引樹被掃描。這通常比ALL快,因?yàn)樗饕募ǔ1葦?shù)據(jù)文件小裸扶。
ALL:對(duì)于每個(gè)來(lái)自于先前的表的行組合,進(jìn)行完整的表掃描框都。

rows :掃描的行
extra :該列包含MySQL解決查詢的詳細(xì)信息,這個(gè)參數(shù)也很重要,主要情況有:

Distinct:MySQL發(fā)現(xiàn)第1個(gè)匹配行后,停止為當(dāng)前的行組合搜索更多的行呵晨。
Not exists:MySQL能夠?qū)Σ樵冞M(jìn)行LEFT JOIN優(yōu)化,發(fā)現(xiàn)1個(gè)匹配LEFT JOIN標(biāo)準(zhǔn)的行后,不再為前面的的行組合在該表內(nèi)檢查更多的行。
range checked for each record (index map: #):MySQL沒有發(fā)現(xiàn)好的可以使用的索引,但發(fā)現(xiàn)如果來(lái)自前面的表的列值已知,可能部分索引可以使用熬尺。
Using filesort:文件排序摸屠,需要利用額外的空間。
Using index:從只使用索引樹中的信息而不需要進(jìn)一步搜索讀取實(shí)際的行來(lái)檢索表中的列信息粱哼。
Using temporary:需要用臨時(shí)表來(lái)容納結(jié)果季二。
Using where:WHERE 子句用于限制哪一個(gè)行匹配下一個(gè)表或發(fā)送到客戶。
Using sort_union(...), Using union(...), Using intersect(...):這些函數(shù)說(shuō)明如何為index_merge聯(lián)接類型合并索引掃描揭措。
Using index for group-by:類似于訪問表的Using index方式,Using index for group-by表示MySQL發(fā)現(xiàn)了一個(gè)索引,
可以用來(lái)查 詢GROUP BY或DISTINCT查詢的所有列,而不要額外搜索硬盤訪問實(shí)際的表胯舷。

注意:
當(dāng)我們的執(zhí)行計(jì)劃所執(zhí)行的結(jié)果的extra中如果出現(xiàn)Using temporary或者Using filesort時(shí),這說(shuō)明我們的sql語(yǔ)句就需要進(jìn)行優(yōu)化了绊含。對(duì)于Using temporary桑嘶,大家并不陌生,當(dāng)我們的查詢涉及多張表時(shí)躬充,需要將查詢結(jié)果放入第三張臨時(shí)表中來(lái)存放逃顶。這樣勢(shì)必會(huì)降低我們的查詢效率,所以當(dāng)遇到extra中為Using temporary時(shí)充甚,也許就是我們應(yīng)該優(yōu)化的時(shí)候了以政。

filesort

但針對(duì)于filesort這種情況,我們就沒有temporary熟悉了伴找。它究竟是什么情況下發(fā)生的呢盈蛮?
這個(gè) filesort 并不是說(shuō)通過磁盤文件進(jìn)行排序,而只是告訴我們進(jìn)行了一個(gè)排序操作技矮。即在MySQL Query Optimizer 所給出的執(zhí)行計(jì)劃
(通過 EXPLAIN 命令查看)中被稱為文件排序(filesort)
文件排序是通過相應(yīng)的排序算法,將取得的數(shù)據(jù)在內(nèi)存中進(jìn)行排序: MySQL需要將數(shù)據(jù)在內(nèi)存中進(jìn)行排序抖誉,
所使用的內(nèi)存區(qū)域也就是我們通過sort_buffer_size 系統(tǒng)變量所設(shè)置的排序區(qū)。
這個(gè)排序區(qū)是每個(gè)Thread 獨(dú)享的穆役,所以說(shuō)可能在同一時(shí)刻在MySQL 中可能存在多個(gè)
 sort buffer 內(nèi)存區(qū)域寸五。
在MySQL中filesort 的實(shí)現(xiàn)算法實(shí)際上是有兩種:
雙路排序:是首先根據(jù)相應(yīng)的條件取出相應(yīng)的排序字段和可以直接定位行數(shù)據(jù)的行指針信息,然后在sort buffer 中進(jìn)行排序耿币。
單路排序:是一次性取出滿足條件行的所有字段梳杏,然后在sort buffer中進(jìn)行排序。
在MySQL4.1版本之前只有第一種排序算法雙路排序,第二種算法是從MySQL4.1開始的改進(jìn)算法十性,
主要目的是為了減少第一次算法中需要兩次訪問表數(shù)
據(jù)的 IO 操作叛溢,將兩次變成了一次,但相應(yīng)也會(huì)耗用更多的sortbuffer 空間劲适。
當(dāng)然楷掉,MySQL4.1開始的以后所有版本同時(shí)也支持第一種算法,
MySQL主要通過比較我們所設(shè)定的系統(tǒng)參數(shù) max_length_for_sort_data的大小和Query 語(yǔ)句所取出的字段類型大小總和來(lái)判定需要使用哪一種排序算法霞势。
如果 max_length_for_sort_data更大烹植,則使用第二種優(yōu)化后的算法,反之使用第一種算法愕贡。所以如果希望 ORDER BY 操作的效率盡可能的高草雕,
一定要主義max_length_for_sort_data 參數(shù)的設(shè)置。曾經(jīng)就有同事的數(shù)據(jù)庫(kù)出現(xiàn)大量的排序等待固以,造成系統(tǒng)負(fù)載很高墩虹,而且響應(yīng)時(shí)間變得很長(zhǎng),
最后查出正是因?yàn)镸ySQL 使用了傳統(tǒng)的第一種排序算法而導(dǎo)致憨琳,在加大了max_length_for_sort_data 參數(shù)值之后诫钓,
系統(tǒng)負(fù)載馬上得到了大的緩解,響應(yīng)也快了很多篙螟。

優(yōu)化Filesort

當(dāng)無(wú)法避免排序操作時(shí)菌湃,又該如何來(lái)優(yōu)化呢?很顯然闲擦,應(yīng)該盡可能讓 MySQL 選擇使用第二種單路算法來(lái)進(jìn)行排序慢味。
這樣可以減少大量的隨機(jī)IO操作,很大幅度地提高排序工作的效率墅冷。

1纯路、加大 max_length_for_sort_data 參數(shù)的設(shè)置

在 MySQL 中,決定使用老式排序算法還是改進(jìn)版排序算法是通過參數(shù) max_length_for_ sort_data 來(lái)決定的寞忿。
當(dāng)所有返回字段的最大長(zhǎng)度小于這個(gè)參數(shù)值時(shí)驰唬,
MySQL 就會(huì)選擇改進(jìn)后的排序算法,反之腔彰,則選擇老式的算法叫编。所以,如果有充足的內(nèi)存讓MySQL 存放須要返回的非排序字段霹抛,
就可以加大這個(gè)參數(shù)的值來(lái)讓 MySQL 選擇使用改進(jìn)版的排序算法搓逾。

2.去掉不必要的返回字段
當(dāng)內(nèi)存不是很充裕時(shí),不能簡(jiǎn)單地通過強(qiáng)行加大上面的參數(shù)來(lái)強(qiáng)迫 MySQL 去使用改進(jìn)版的排序算法杯拐,否則可能會(huì)造成 MySQL
不得不將數(shù)據(jù)分成很多段霞篡,
然后進(jìn)行排序世蔗,這樣可能會(huì)得不償失。此時(shí)就須要去掉不必要的返回字段朗兵,讓返回結(jié)果長(zhǎng)度適應(yīng) max_length_for_sort_data 參數(shù)的限制污淋。

3、增大 sort_buffer_size 參數(shù)設(shè)置
增大 sort_buffer_size 并不是為了讓 MySQL選擇改進(jìn)版的排序算法余掖,而是為了讓MySQL盡量減少在排序過程中對(duì)須要排序的數(shù)據(jù)進(jìn)行分段寸爆,
因?yàn)榉侄螘?huì)造成 MySQL 不得不使用臨時(shí)表來(lái)進(jìn)行交換排序。

小結(jié)

以上就是有關(guān)explain執(zhí)行計(jì)劃的一個(gè)簡(jiǎn)單的介紹盐欺。通過查看sql語(yǔ)句的執(zhí)行計(jì)劃赁豆,我們可以很容易的分析出sql語(yǔ)句在哪些子句或者哪些列,
返回結(jié)果等地方應(yīng)該進(jìn)行著重的優(yōu)化找田,為我們提高程序性能帶來(lái)很大的方便歌憨!

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市墩衙,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌甲抖,老刑警劉巖漆改,帶你破解...
    沈念sama閱讀 221,695評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異准谚,居然都是意外死亡挫剑,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,569評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門柱衔,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)樊破,“玉大人,你說(shuō)我怎么就攤上這事唆铐≌芷荩” “怎么了?”我有些...
    開封第一講書人閱讀 168,130評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵艾岂,是天一觀的道長(zhǎng)顺少。 經(jīng)常有香客問我,道長(zhǎng)王浴,這世上最難降的妖魔是什么脆炎? 我笑而不...
    開封第一講書人閱讀 59,648評(píng)論 1 297
  • 正文 為了忘掉前任,我火速辦了婚禮氓辣,結(jié)果婚禮上秒裕,老公的妹妹穿的比我還像新娘。我一直安慰自己钞啸,他們只是感情好几蜻,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,655評(píng)論 6 397
  • 文/花漫 我一把揭開白布喇潘。 她就那樣靜靜地躺著,像睡著了一般入蛆。 火紅的嫁衣襯著肌膚如雪响蓉。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,268評(píng)論 1 309
  • 那天哨毁,我揣著相機(jī)與錄音枫甲,去河邊找鬼。 笑死扼褪,一個(gè)胖子當(dāng)著我的面吹牛想幻,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播话浇,決...
    沈念sama閱讀 40,835評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼脏毯,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了幔崖?” 一聲冷哼從身側(cè)響起食店,我...
    開封第一講書人閱讀 39,740評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎赏寇,沒想到半個(gè)月后吉嫩,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,286評(píng)論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡嗅定,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,375評(píng)論 3 340
  • 正文 我和宋清朗相戀三年自娩,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片渠退。...
    茶點(diǎn)故事閱讀 40,505評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡忙迁,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出碎乃,到底是詐尸還是另有隱情姊扔,我是刑警寧澤,帶...
    沈念sama閱讀 36,185評(píng)論 5 350
  • 正文 年R本政府宣布荠锭,位于F島的核電站旱眯,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏证九。R本人自食惡果不足惜删豺,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,873評(píng)論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望愧怜。 院中可真熱鬧呀页,春花似錦、人聲如沸拥坛。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,357評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至丸氛,卻和暖如春培愁,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背缓窜。 一陣腳步聲響...
    開封第一講書人閱讀 33,466評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工定续, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人禾锤。 一個(gè)月前我還...
    沈念sama閱讀 48,921評(píng)論 3 376
  • 正文 我出身青樓私股,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親恩掷。 傳聞我的和親對(duì)象是個(gè)殘疾皇子倡鲸,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,515評(píng)論 2 359

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

  • 藝術(shù)國(guó)際玄寂閱讀 119評(píng)論 0 0
  • 時(shí)區(qū)與日期的相關(guān)操作 獲取當(dāng)前時(shí)間的 年 月 日 時(shí) 分 秒 周 等 查看今天是今年的第幾周 將拆分的出來(lái)的 時(shí)...
    Rui哥閱讀 1,573評(píng)論 0 1
  • 我想峭状,所有的故事都有一個(gè)開場(chǎng)吧,而今天要講述的故事也是一樣的套路逼争!如果你有興趣看下去宁炫,我覺得你一定會(huì)有收獲,畢竟這...
    馬克圖布了閱讀 1,687評(píng)論 16 34
  • 感受一下來(lái)自兒子一萬(wàn)點(diǎn)的傷害氮凝。昨天老師發(fā)給我看兒子寫的作文,笑的我喲~
    啊糖呀閱讀 182評(píng)論 0 0