MySQL慢查詢(下):問題解決奄侠,干貨總結(jié)

上篇回顧

繼上兩篇:

MySQL慢查詢(上):你知道為啥會慢么蓬痒?

MySQL慢查詢(中):正確的處理姿勢,你get到了嗎诈乒?

在以上兩篇內(nèi)容中,我們一起探索了這些內(nèi)容:

1)SQL執(zhí)行過程

2)查詢SQL為什么會慢

3)如何定位查詢問題

4)幾種實(shí)用解決方案介紹

如果將MySQL慢查詢作為一個問題來拆解分析的話婆芦,之前上怕磨、中篇章算是問題分析、問題定位和解決消约,那今天來跟大家收下尾肠鲫,聊聊MySQL慢查詢問題解決經(jīng)驗(yàn)總結(jié)。

廢話不多說或粮,直接開干~

高性能查詢難題優(yōu)化總結(jié)

我們來總結(jié)一下导饲,應(yīng)該如何處理高性能查詢難題?

假如把高性能查詢比作一個“難題”氯材,它其實(shí)是包括多個子難題在內(nèi)渣锦,共同作用的結(jié)果。

今天我們來歸納總結(jié)下氢哮,主要包括以下幾類:

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

良好的schema設(shè)計(jì)原則是普遍適用的袋毙,但是MySQL有他自己的實(shí)現(xiàn)細(xì)節(jié)要注意,概況來講冗尤,盡可能保持任何東西小而簡單總是好的听盖。

主要有以下簡單的原則值得你去考慮使用:

1)盡量避免過度設(shè)計(jì)

2)使用小而簡單的合適數(shù)據(jù)類型胀溺,盡可能避免使用null

3)盡量使用相同的數(shù)據(jù)類型存儲相似或者相關(guān)的值

4)注意可變長字符串,其在臨時(shí)表和排序時(shí)可能按最大長度分配內(nèi)存

5)盡量使用整形定義標(biāo)識符

2 索引設(shè)計(jì)優(yōu)化

常見的B-Tree索引皆看,按照順序存儲數(shù)據(jù)仓坞,所以MySQL可以用來做ORDER BY 和 GROUP BY操作。因?yàn)閿?shù)據(jù)是有序的腰吟,所以便于將相關(guān)的列值都存儲在一起扯躺。由于索引中存儲了實(shí)際的列值,所以一些查詢只通過索引就能夠完成查詢(如:聚簇索引)蝎困。

根據(jù)索引的特性录语,總結(jié)索引的優(yōu)點(diǎn)有如下幾點(diǎn):

1)減少服務(wù)器需要掃描的數(shù)據(jù)量;

2)幫助服務(wù)器避免排序和臨時(shí)表禾乘;

3)將隨機(jī)I/O變?yōu)轫樞騃/O澎埠。

編寫查詢語句時(shí)候應(yīng)該注意盡可能選擇合適的索引,以避免單行查找始藕,盡可能使用索引覆蓋蒲稳。

根據(jù)執(zhí)行計(jì)劃依次掃描相關(guān)表中的行,不在數(shù)據(jù)緩沖區(qū)的走IO存儲引擎掃描表的性能消耗參考下面的list伍派,消耗從大到薪:

全表掃描>全索引掃描>部分索引掃描>索引查找>唯一索引/主鍵查找>常量/null

應(yīng)用查詢優(yōu)化是建立在良好的數(shù)據(jù)結(jié)構(gòu)和合理的索引設(shè)計(jì)之上的。

它主要包括以下幾種情況:

2.1 重構(gòu)查詢方式

優(yōu)化慢查詢時(shí)诉植,目標(biāo)應(yīng)該是找到一個更優(yōu)的方案來達(dá)到我們獲取結(jié)果數(shù)據(jù)的目的祥国。其中可以存在多樣的權(quán)衡方案:

1)從數(shù)據(jù)庫中查詢計(jì)算直接獲取到結(jié)果數(shù)據(jù);

2)拆分多條子查詢來逐步得到結(jié)果數(shù)據(jù)晾腔;

3)從數(shù)據(jù)庫獲取到基礎(chǔ)數(shù)據(jù)舌稀,然后應(yīng)用代碼邏輯加工后獲得結(jié)果數(shù)據(jù)。

2.2 讓SQL盡量符合查詢優(yōu)化器的執(zhí)行要求

MySQL 查詢優(yōu)化器并不是對所有查詢都適用的灼擂,我們可以通過改寫查詢 SQL 來讓數(shù)據(jù)庫更高效的完成工作壁查。

常見查詢應(yīng)用優(yōu)化建議匯總?cè)缦拢?/p>

1)對于任何查詢,應(yīng)盡量避免全表掃描

????首先應(yīng)考慮在 where 及 order by 涉及的列上建立并應(yīng)用索引剔应;

2)盡量避免在 where 子句中進(jìn)行操作

????使用 or 來連接條件睡腿、對字段進(jìn)行 null 值判斷、匹配查詢 '%abc%'峻贮、!= 或 <> 操作符席怪,否則將導(dǎo)致引擎放棄使用索引而進(jìn)行全表掃描;

3)盡量應(yīng)用索引

? ? 使用索引字段作為條件時(shí)月洛,如果是復(fù)合索引何恶,那么必須使用到該索引中的第一個字段作為條件時(shí)才能保證系統(tǒng)使用該索引,否則該索引將不會被使用嚼黔,并且應(yīng)盡可能的讓字段順序與索引順序相一致细层;

4)索引字段要注意慎重選取

????索引盡量避開區(qū)分度不大的字段惜辑,如:sex、male疫赎、female?

? ? 這種五五開的索引列有大量數(shù)據(jù)重復(fù)時(shí)盛撑,那么即使在 sex 上建了索引也對查詢效率起不了作用。

5)一個表的索引數(shù)最好不要超過 6 個

????索引并不是越多越好捧搞,索引固然可以提高相應(yīng)的 select 的效率抵卫,但同時(shí)也降低了 insert 及 update 的效率, 因?yàn)?insert 或 update 時(shí)有可能會重建索引胎撇,所以怎樣建索引需要慎重考慮介粘,視具體情況而定。

6)盡量使用數(shù)字型字段

????若只含數(shù)值信息的字段盡量不要設(shè)計(jì)為字符型晚树,這會降低查詢和連接的性能姻采,并會增加存儲開銷。?這是因?yàn)橐嬖谔幚聿樵兒瓦B接時(shí)會逐個比較字符串中每一個字符爵憎,而對于數(shù)字型而言只需要比較一次就夠了慨亲。

7)盡量避免使用 *

??? select * from table ,用具體的字段列表代替 *宝鼓,不要返回用不到的任何字段刑棵,尤其是多表關(guān)聯(lián)查詢的情況。

MySQL v5.6版本以后愚铡,消除了很多MySQL原本的限制蛉签,讓更多的查詢能夠以盡可能高的效率完成。

小結(jié)

良好的表結(jié)構(gòu)設(shè)計(jì)是高性能查詢的基石茂附,恰當(dāng)?shù)乃饕O(shè)計(jì)是高性能查詢的助推器正蛙,同時(shí)合理的查詢應(yīng)用也是必不可少的。數(shù)據(jù)結(jié)構(gòu)優(yōu)化营曼、索引設(shè)計(jì)優(yōu)化及應(yīng)用查詢優(yōu)化猶如三叉戟一般,齊頭并進(jìn)愚隧,在高性能查詢應(yīng)用中缺一不可蒂阱。

寫在最后

全文總結(jié)一下,其實(shí)就是我們要學(xué)會用數(shù)據(jù)庫的要求方式來執(zhí)行SQL狂塘。

即要寫好應(yīng)用查詢SQL录煤,必須要結(jié)合良好的數(shù)據(jù)結(jié)構(gòu)和合理的索引設(shè)計(jì)才可以。

其實(shí)MySQL查詢優(yōu)化中的每一項(xiàng)拆開講都可以是很大的章節(jié)荞胡,在此主要是將解決問題的思路分享給大家妈踊,希望能對大家今后的工作中能有所幫助。

最后泪漂,感謝大家的持續(xù)關(guān)注~

作者:架構(gòu)精進(jìn)之路廊营,專注軟件架構(gòu)研究歪泳,技術(shù)學(xué)習(xí)與個人成長,關(guān)注并私信我回復(fù)“01”露筒,送你一份程序員成長進(jìn)階大禮包呐伞。


Thanks for reading!

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市慎式,隨后出現(xiàn)的幾起案子伶氢,更是在濱河造成了極大的恐慌,老刑警劉巖瘪吏,帶你破解...
    沈念sama閱讀 211,376評論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件癣防,死亡現(xiàn)場離奇詭異,居然都是意外死亡掌眠,警方通過查閱死者的電腦和手機(jī)蕾盯,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,126評論 2 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來扇救,“玉大人刑枝,你說我怎么就攤上這事⊙盖唬” “怎么了装畅?”我有些...
    開封第一講書人閱讀 156,966評論 0 347
  • 文/不壞的土叔 我叫張陵,是天一觀的道長沧烈。 經(jīng)常有香客問我掠兄,道長,這世上最難降的妖魔是什么锌雀? 我笑而不...
    開封第一講書人閱讀 56,432評論 1 283
  • 正文 為了忘掉前任蚂夕,我火速辦了婚禮,結(jié)果婚禮上腋逆,老公的妹妹穿的比我還像新娘婿牍。我一直安慰自己,他們只是感情好惩歉,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,519評論 6 385
  • 文/花漫 我一把揭開白布等脂。 她就那樣靜靜地躺著,像睡著了一般撑蚌。 火紅的嫁衣襯著肌膚如雪上遥。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,792評論 1 290
  • 那天争涌,我揣著相機(jī)與錄音粉楚,去河邊找鬼。 笑死,一個胖子當(dāng)著我的面吹牛模软,可吹牛的內(nèi)容都是我干的伟骨。 我是一名探鬼主播,決...
    沈念sama閱讀 38,933評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼撵摆,長吁一口氣:“原來是場噩夢啊……” “哼底靠!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起特铝,我...
    開封第一講書人閱讀 37,701評論 0 266
  • 序言:老撾萬榮一對情侶失蹤暑中,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后鲫剿,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體鳄逾,經(jīng)...
    沈念sama閱讀 44,143評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,488評論 2 327
  • 正文 我和宋清朗相戀三年灵莲,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了雕凹。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,626評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡政冻,死狀恐怖枚抵,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情明场,我是刑警寧澤汽摹,帶...
    沈念sama閱讀 34,292評論 4 329
  • 正文 年R本政府宣布,位于F島的核電站苦锨,受9級特大地震影響逼泣,放射性物質(zhì)發(fā)生泄漏真友。R本人自食惡果不足惜吆玖,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,896評論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望木缝。 院中可真熱鬧秃励,春花似錦氏仗、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,742評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至谣旁,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間滋早,已是汗流浹背榄审。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評論 1 265
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留杆麸,地道東北人搁进。 一個月前我還...
    沈念sama閱讀 46,324評論 2 360
  • 正文 我出身青樓浪感,卻偏偏與公主長得像,于是被迫代替她去往敵國和親饼问。 傳聞我的和親對象是個殘疾皇子影兽,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,494評論 2 348

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