mysql(Innodb引擎)性能優(yōu)化(表設計和query語句)

經(jīng)常用mysql,也都是自己設計表結(jié)構(gòu),寫sql,但是由于業(yè)務規(guī)模小,對sql性能要求不高,所以很少注意到這一塊,但是最近DBA出了一個慢sql報表,才發(fā)現(xiàn)自己寫的都是慢sql,因此通過讀書思灰、查資料對這一塊做了一些了解,整理一下玷犹。

影響數(shù)據(jù)庫性能的相關(guān)因素

1. 系統(tǒng)架構(gòu)對數(shù)據(jù)庫性能的影響

  • 數(shù)據(jù)庫中存放的數(shù)據(jù)是否真正適合在數(shù)據(jù)庫中存放?一般情況下有三種數(shù)據(jù)不適合存放在數(shù)據(jù)庫中,二 進制多媒體數(shù)據(jù)洒疚,超大文本數(shù)據(jù)歹颓,流水隊列數(shù)據(jù)(需要頻繁的insert,update,delete)坯屿。

  • 是否合理的利用了cache?尤其是對于訪問頻繁但變更少的數(shù)據(jù)應當有chache緩解數(shù)據(jù)庫壓力。

2. 表結(jié)構(gòu)對數(shù)據(jù)庫性能的影響

  • 在表結(jié)構(gòu)設計時就應該結(jié)合業(yè)務考慮到避免昂貴操作和性能優(yōu)化巍扛。

3. query語句對數(shù)據(jù)庫的影響

  • 對于同一份數(shù)據(jù),當以不同方式去尋找其中某一部分內(nèi)容的時候,須要讀取 的數(shù)據(jù)量可能會有天壤之別,所消耗的資源自然也是區(qū)別甚大领跛。

其中第一點需要在整個系統(tǒng)的架構(gòu)設計時考慮合適的技術(shù)選型和性能優(yōu)化點, 此處不進行詳敘, 下面主要對表結(jié)構(gòu)設計和query語句優(yōu)化需要注意的點做簡單的梳理。

表結(jié)構(gòu)設計優(yōu)化策略

1. 適度冗余, 減少頻繁查詢的join操作

join操作本身就比較耗時,而且mysql對于復雜的join操作容易出現(xiàn)不合理的執(zhí)行計劃,因此對于更新不頻繁但是查詢頻繁的其他表中的數(shù)據(jù)可以適當冗余存儲在查詢主表中,比如大多數(shù)查詢博客的時候都同時需要其作者名, 而一片博客的作者名幾乎很少會修改, 因此博客表中可以冗余存儲作者名, 避免每次都需要和用戶表作join操作, 提高博客的查詢性能撤奸。

2. 大字段垂直拆分

大多數(shù)情況下大字段的訪問都不是很頻繁, 但由于其大, 往往帶來較大的IO開銷, 因此通過將其拆分出去, 可以在訪問其他字段時大大降低IO訪問, 從而提高性能吠昭。比如博客表, 其中博客內(nèi)容就屬于大字段,而且相對于博客標題,摘要,作者,發(fā)布時間,類型等字段來說, 訪問頻率也相對低許多(只有當用戶看到前面這些字段并且對這篇博客產(chǎn)生興趣的時候才會查看博客內(nèi)容),因此就可以單獨拆分出去。其實不止是大字段,所有訪問不頻繁的字段都可以和大字段一起拆分出去胧瓜。

3. 大表基于類型進行分拆

一個表中存儲的數(shù)據(jù)雖然都屬于同一類, 但是很多情況下也有細分類型, 有時候不同類型的讀寫比例,訪問頻率可能都有很大差別, 因此將這些差別較大的類型單獨拆分出一個表, 不僅不同類型的數(shù)據(jù)查詢相互不受拖累,而且也更有利用cache矢棚。

4. 選擇合適的數(shù)據(jù)類型

  • 選擇更小的數(shù)據(jù)類型, 可以使查詢相同數(shù)據(jù)需要的IO資源降低,如果是索引字段,也能更好的利用索引。

  • 對于數(shù)字的存儲,盡可能使用整數(shù)存儲,可以使數(shù)據(jù)的處理更為高效府喳。

  • 對于時間類型, 如果不需要存儲1970年之前的數(shù)據(jù), 盡可能采用TIMESTAMP類型(只能存儲1970年以后的時間,但是僅需要4字節(jié),其他類型均需要8字節(jié))幻妓。

query語句優(yōu)化

1. 基本原則

  • 重點優(yōu)化高并發(fā)的查詢, 對于高并發(fā)的查詢每次節(jié)省一點資源,對整個系統(tǒng)來說也會帶來很大的收益

  • 使用EXPLAIN 和 PROFILING, 使用EXPLAIN可以看到一條sql語句在當前狀態(tài)的數(shù)據(jù)庫中的執(zhí)行計劃, 而PROFILING則可以看到一條sql語句具體耗費的資源情況,從而找到性能瓶頸。

  • 只取出自己需要的column, 尤其是在需要排序的query中, 取出的column越少傳輸數(shù)據(jù)量就越小,從而也就有更好的性能,在mysql4.1之后,排序時會將所需的所有column取出,在排序區(qū)排好以后返回給客戶端,因此如果將不需要的column也取出,就是對內(nèi)存的浪費劫拢。

  • 永遠用小結(jié)果集驅(qū)動大結(jié)果集, mysql的join都是通過嵌套循環(huán)來實現(xiàn)的湾宙。驅(qū)動結(jié)果集越大,所需要循環(huán) 就越多, 那么被驅(qū)動表的訪問次數(shù)自然也就越多, 而每次訪問被驅(qū)動表,即使需要的IO很少,循環(huán)次數(shù)多了, 總量也不可能小, 而且每次循環(huán)都不能避免消耗CPU, 所以CPU運算量也會增加扒吁。

  • 盡可能在索引中完成排序, 利用索引進行排序操作, 主要是利用了索引的有序性。在通過索引進行檢索 的過程中,就已經(jīng)得到了有序的數(shù)據(jù)訪問順序, 依次讀取結(jié)果數(shù)據(jù)后就不須要進行排序操作,進而避免了此操作借浊。

  • 僅僅使用最有效的查詢條件,避免mysql作出不理想的執(zhí)行計劃版保。

  • 盡可能避免復雜join和子查詢, 當并發(fā)量比較高的時候, 容易發(fā)生鎖爭用和死鎖拐揭。

2. 關(guān)于索引

主要針對InnoDB引擎的B-Tree索引做一些探究, B-Tree索引通過B+樹(一種Balance Tree結(jié)構(gòu)),所有實際需要的數(shù)據(jù)都存放于Leaf Node, 而索引則存放在Branch Node娶吞。對于主鍵索引而言,其Leaf Node中存儲的就是表的實際數(shù)據(jù)(不僅包括主鍵,而且包括其他數(shù)據(jù)), 這個表的數(shù)據(jù)按照主鍵有序排列。而普通索引的Leaf Node中則存放的是索引鍵和主鍵值, 因此在InnoDB中通過主鍵訪問數(shù)據(jù)效率是非常高的, 而如果通過 普通索引來訪的話, InnoDB首先通過普通索引的相關(guān)信息及相應的索引鍵檢索到Leaf Node, 再通過Leaf Node中存放的主鍵值和主鍵索引來獲取相應的數(shù)據(jù)行牵寺。索引可以節(jié)省IO次數(shù), 但是也會增加數(shù)據(jù)量和修改操作的復雜度, 可以根據(jù)一下幾個原則判斷是否為一個字段創(chuàng)建索引:

  • 較為頻繁的作為查詢條件的字段應當建索引

  • 唯一性太差的字段不適合單獨創(chuàng)建建索引

  • 更新非常頻繁字段不適合創(chuàng)建索引

  • 不會出現(xiàn)在where子句中的字段不適合創(chuàng)建索引

  • join操作內(nèi)驅(qū)表使用的字段應該建索引, join語句會根據(jù)內(nèi)驅(qū)表的join字段進行循環(huán)查詢,因此在改字段上加索引可以有效提高join語句的性能

  • 需要用來做排序(ORDER BY)悍引、分組(GROUP BY)、 去重(DISTINCT)的字段可以考慮建索引,排序操作創(chuàng)建索引的原理在基本原則中已經(jīng)說明, mysql的分組操作也可以利用索引,而且分組操作默認會進行排序(如果對順序不關(guān)心,可以通過在整個語句后面添加一個以null排序的[ORDER BY null]子句來顯式禁止排序提高性能)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末帽氓,一起剝皮案震驚了整個濱河市趣斤,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌黎休,老刑警劉巖浓领,帶你破解...
    沈念sama閱讀 218,284評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異势腮,居然都是意外死亡联贩,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,115評論 3 395
  • 文/潘曉璐 我一進店門捎拯,熙熙樓的掌柜王于貴愁眉苦臉地迎上來泪幌,“玉大人,你說我怎么就攤上這事』隼幔” “怎么了吗浩?”我有些...
    開封第一講書人閱讀 164,614評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長浴滴。 經(jīng)常有香客問我拓萌,道長岁钓,這世上最難降的妖魔是什么升略? 我笑而不...
    開封第一講書人閱讀 58,671評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮屡限,結(jié)果婚禮上品嚣,老公的妹妹穿的比我還像新娘。我一直安慰自己钧大,他們只是感情好翰撑,可當我...
    茶點故事閱讀 67,699評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著啊央,像睡著了一般眶诈。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上瓜饥,一...
    開封第一講書人閱讀 51,562評論 1 305
  • 那天逝撬,我揣著相機與錄音,去河邊找鬼乓土。 笑死宪潮,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的趣苏。 我是一名探鬼主播狡相,決...
    沈念sama閱讀 40,309評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼食磕!你這毒婦竟也來了尽棕?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,223評論 0 276
  • 序言:老撾萬榮一對情侶失蹤彬伦,失蹤者是張志新(化名)和其女友劉穎萄金,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體媚朦,經(jīng)...
    沈念sama閱讀 45,668評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡氧敢,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,859評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了询张。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片孙乖。...
    茶點故事閱讀 39,981評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出唯袄,到底是詐尸還是另有隱情弯屈,我是刑警寧澤,帶...
    沈念sama閱讀 35,705評論 5 347
  • 正文 年R本政府宣布恋拷,位于F島的核電站资厉,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏蔬顾。R本人自食惡果不足惜宴偿,卻給世界環(huán)境...
    茶點故事閱讀 41,310評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望诀豁。 院中可真熱鬧窄刘,春花似錦、人聲如沸舷胜。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,904評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽烹骨。三九已至翻伺,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間沮焕,已是汗流浹背吨岭。 一陣腳步聲響...
    開封第一講書人閱讀 33,023評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留遇汞,地道東北人未妹。 一個月前我還...
    沈念sama閱讀 48,146評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像空入,于是被迫代替她去往敵國和親络它。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,933評論 2 355

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