<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    qileilove

    blog已經(jīng)轉(zhuǎn)移至github,大家請(qǐng)?jiān)L問 http://qaseven.github.io/

    MySQL數(shù)據(jù)庫(kù)性能優(yōu)化之索引優(yōu)化

    大家都知道索引對(duì)于數(shù)據(jù)訪問的性能有非常關(guān)鍵的作用,都知道索引可以提高數(shù)據(jù)訪問效率。

      為什么索引能提高數(shù)據(jù)訪問性能?他會(huì)不會(huì)有“副作用”?是不是索引創(chuàng)建越多,性能就越好?到底該如何設(shè)計(jì)索引,才能最大限度的發(fā)揮其效能?

      這篇文章主要是帶著上面這幾個(gè)問題來做一個(gè)簡(jiǎn)要的分析,同時(shí)排除了業(yè)務(wù)場(chǎng)景所帶來的特殊性,請(qǐng)不要糾結(jié)業(yè)務(wù)場(chǎng)景的影響。

      這是 MySQL數(shù)據(jù)庫(kù)性能優(yōu)化專題 系列的第三篇文章:MySQL 數(shù)據(jù)庫(kù)性能優(yōu)化之索引優(yōu)化

      系列的第二篇文章:MySQL 數(shù)據(jù)庫(kù)性能優(yōu)化之表結(jié)構(gòu)優(yōu)化

      系列的第一篇文章:MySQL 數(shù)據(jù)庫(kù)性能優(yōu)化之緩存參數(shù)優(yōu)化

      索引為什么能提高數(shù)據(jù)訪問性能?

      很多人只知道索引能夠提高數(shù)據(jù)庫(kù)的性能,但并不是特別了解其原理,其實(shí)我們可以用一個(gè)生活中的示例來理解。

       我們讓一位不太懂計(jì)算機(jī)的朋友去圖書館確認(rèn)一本叫做《MySQL性能調(diào)優(yōu)與架構(gòu)設(shè)計(jì)》的書是否在藏,這樣對(duì)他說:“請(qǐng)幫我借一本計(jì)算機(jī)類的數(shù)據(jù)庫(kù)書籍, 是屬于 MySQL 數(shù)據(jù)庫(kù)范疇的,叫做《MySQL性能調(diào)優(yōu)與架構(gòu)設(shè)計(jì)》”。朋友會(huì)根據(jù)所屬類別,前往存放“計(jì)算機(jī)”書籍區(qū)域的書架,然后再尋找“數(shù)據(jù)庫(kù)”類存放位置,再找 到一堆講述“MySQL”的書籍,最后可能發(fā)現(xiàn)目標(biāo)在藏(也可能已經(jīng)借出不在書架上)。

      在這個(gè)過程中: “計(jì)算機(jī)”->“數(shù)據(jù)庫(kù)”->“MySQL”->“在藏”->《MySQL性能調(diào)優(yōu)與架構(gòu)設(shè)計(jì)》其實(shí)就是一個(gè)“根據(jù)索引查找數(shù) 據(jù)”的典型案例,“計(jì)算機(jī)”->“數(shù)據(jù)庫(kù)”->“MySQL”->“在藏” 就是朋友查找書籍的索引。

      假設(shè)沒有這個(gè) 索引,那查找這本書的過程會(huì)變成怎樣呢?朋友只能從圖書館入口一個(gè)書架一個(gè)書架的“遍歷”,直到找到《MySQL性能調(diào)優(yōu)與架構(gòu)設(shè)計(jì)》這本書為止。如果幸 運(yùn),可能在第一個(gè)書架就找到。但如果不幸呢,那就慘了,可能要將整個(gè)圖書館所有的書架都找一遍才能找到我們想要的這本書。

      注:這個(gè)例子 中的“索引”是記錄在朋友大腦中的,實(shí)際上,每個(gè)圖書館都會(huì)有一個(gè)非常全的實(shí)際存在的索引系統(tǒng)(大多位于入口顯眼處),由很多個(gè)貼上了明顯標(biāo)簽的小抽屜構(gòu) 成。這個(gè)索引系統(tǒng)中存放這非常齊全詳盡的索引數(shù)據(jù),標(biāo)識(shí)出我們需要查找的“目標(biāo)”在某個(gè)區(qū)域的某個(gè)書架上。而且每當(dāng)有新的書籍入庫(kù),舊的書籍銷毀以及書記 信息修改,都需要對(duì)索引系統(tǒng)進(jìn)行及時(shí)的修正。

      下面我們通過上面這個(gè)生活中的小示例,來分析一下索引,看看能的出哪些結(jié)論?

      索引有哪些“副作用”?

      圖書的變更(增,刪,改)都需要修訂索引,索引存在額外的維護(hù)成本

      查找翻閱索引系統(tǒng)需要消耗時(shí)間,索引存在額外的訪問成本

      這個(gè)索引系統(tǒng)需要一個(gè)地方來存放,索引存在額外的空間成本

      索引是不是越多越好?

      如果我們的這個(gè)圖書館只是一個(gè)進(jìn)出中轉(zhuǎn)站,里面的新書進(jìn)來后很快就會(huì)轉(zhuǎn)發(fā)去其他圖書館而從這個(gè)館藏中“清除”,那我們的索引就只會(huì)不斷的修改,而很少會(huì)被用來查找圖書

      所以,對(duì)于類似于這樣的存在非常大更新量的數(shù)據(jù),索引的維護(hù)成本會(huì)非常高,如果其檢索需求很少,而且對(duì)檢索效率并沒有非常高的要求的時(shí)候,我們并不建議創(chuàng)建索引,或者是盡量減少索引。

     如果我們的書籍量少到只有幾本或者就只有一個(gè)書架,索引并不會(huì)帶來什么作用,甚至可能還會(huì)浪費(fèi)一些查找索引所花費(fèi)的時(shí)間。

      所以,對(duì)于數(shù)據(jù)量極小到通過索引檢索還不如直接遍歷來得快的數(shù)據(jù),也并不適合使用索引。

      如果我們的圖書館只有一個(gè)10平方的面積,現(xiàn)在連放書架都已經(jīng)非常擁擠,而且館藏還在不斷增加,我們還能考慮創(chuàng)建索引嗎?

      所以,當(dāng)我們連存儲(chǔ)基礎(chǔ)數(shù)據(jù)的空間都捉襟見肘的時(shí)候,我們也應(yīng)該盡量減少低效或者是去除索引。

      索引該如何設(shè)計(jì)才高效?

      如果我們僅僅只是這樣告訴對(duì)方的:“幫我確認(rèn)一本數(shù)據(jù)庫(kù)類別的講述 MySQL 的叫做《MySQL性能調(diào)優(yōu)與架構(gòu)設(shè)計(jì)》的書是否在藏”,結(jié)果又會(huì)如何呢?朋友只能一個(gè)大類區(qū)域一個(gè)大類區(qū)域的去尋找“數(shù)據(jù)庫(kù)”類別,然后再找到 “MySQL”范疇,再看到我們所需是否在藏。由于我們少說了一個(gè)“計(jì)算機(jī)類”,朋友就必須到每一個(gè)大類去尋找。

      所以,我們應(yīng)該盡量讓查找條件盡可能多的在索引中,盡可能通過索引完成所有過濾,回表只是取出額外的數(shù)據(jù)字段。

      如果我們是這樣說的:“幫我確認(rèn)一本講述 MySQL 的數(shù)據(jù)庫(kù)范疇的計(jì)算機(jī)叢書,叫做《MySQL性能調(diào)優(yōu)與架構(gòu)設(shè)計(jì)》,看是否在藏”。如果這位朋友并不知道計(jì)算機(jī)是一個(gè)大類,也不知道數(shù)據(jù)庫(kù)屬于計(jì)算機(jī)大 類,那這位朋友就悲劇了。首先他得遍歷每個(gè)類別確認(rèn)“MySQL”存在于哪些類別中,然后從包含 “MySQL” 書籍中再看有哪些是“數(shù)據(jù)庫(kù)”范疇的(有可能部分是講述PHP或者其他開發(fā)語(yǔ)言的),然后再排除非計(jì)算機(jī)類的(雖然可能并沒有必要),然后才能確認(rèn)。

      所以,字段的順序?qū)M合索引效率有至關(guān)重要的作用,過濾效果越好的字段需要更靠前。

      如果我們還有這樣一個(gè)需求(雖然基本不可能):“幫我將圖書館中所有的計(jì)算機(jī)圖書借來”。朋友如果通過索引來找,每次都到索引柜找到計(jì)算機(jī)書籍 所在的區(qū)域,然后從書架上搬下一格(假設(shè)只能以一格為單位從書架上取下,類比數(shù)據(jù)庫(kù)中以block/page為單位讀取),取出第一本,然后再?gòu)乃饕裾?到計(jì)算機(jī)圖書所在區(qū)域,再搬下一格,取出一本… 如此往復(fù)直至取完所有的書。如果他不通過索引來找又會(huì)怎樣呢?他需要從地一個(gè)書架一直往后找,當(dāng)找到計(jì)算機(jī)的書,搬下一格,取出所有計(jì)算機(jī)的書,再往后, 直至所有書架全部看一遍。在這個(gè)過程中,如果計(jì)算機(jī)類書籍較多,通過索引來取所花費(fèi)的時(shí)間很可能要大于直接遍歷,因?yàn)椴粩嗤鶑?fù)的索引翻閱所消耗的時(shí)間會(huì)非 常長(zhǎng)。(延伸閱讀:這里有一篇以前寫的關(guān)于Oracle的文章,索引掃描還是全表掃描(Index Scan Or Full Table Scan))

      所以,當(dāng)我們需要讀取的數(shù)據(jù)量占整個(gè)數(shù)據(jù)量的比例較大抑或者說索引的過濾效果并不是太好的時(shí)候,使用索引并不一定優(yōu)于全表掃描。

      如果我們的朋友不知道“數(shù)據(jù)庫(kù)”這個(gè)類別可以屬于“計(jì)算機(jī)”這個(gè)大類,抑或者圖書館的索引系統(tǒng)中這兩個(gè)類別屬性并沒有關(guān)聯(lián)關(guān)系,又會(huì)怎樣呢?也 就是說,朋友得到的是2個(gè)獨(dú)立的索引,一個(gè)是告知“計(jì)算機(jī)”這個(gè)大類所在的區(qū)域,一個(gè)是“數(shù)據(jù)庫(kù)”這個(gè)小類所在的區(qū)域(很可能是多個(gè)區(qū)域),那么他只能二 者選其一來搜索我的需求。即使朋友可以分別通過2個(gè)索引檢索然后自己在腦中取交集再找,那這樣的效率實(shí)際過程中也會(huì)比較低下。

      所以,在實(shí)際使用過程中,一次數(shù)據(jù)訪問一般只能利用到1個(gè)索引,這一點(diǎn)在索引創(chuàng)建過程中一定要注意,不是說一條SQL語(yǔ)句中Where子句里面每個(gè)條件都有索引能對(duì)應(yīng)上就可以了。

      看完這些分析,我想大家應(yīng)該了解索引優(yōu)化的一些基本思路了吧。

    posted on 2012-05-07 09:27 順其自然EVO 閱讀(162) 評(píng)論(0)  編輯  收藏 所屬分類: 數(shù)據(jù)庫(kù)

    <2012年5月>
    293012345
    6789101112
    13141516171819
    20212223242526
    272829303112
    3456789

    導(dǎo)航

    統(tǒng)計(jì)

    常用鏈接

    留言簿(55)

    隨筆分類

    隨筆檔案

    文章分類

    文章檔案

    搜索

    最新評(píng)論

    閱讀排行榜

    評(píng)論排行榜

    主站蜘蛛池模板: 亚洲va在线va天堂va手机| 伊人久久亚洲综合影院首页| 日韩精品内射视频免费观看| 亚洲日本国产精华液| 亚洲heyzo专区无码综合| 亚洲а∨天堂久久精品| 国产午夜无码精品免费看动漫| 国产日韩成人亚洲丁香婷婷| 一级毛片免费观看不卡视频| 国产A在亚洲线播放| 一个人免费观看www视频在线| 亚洲乱码一二三四区国产| 免费看香港一级毛片| 亚洲hairy多毛pics大全| 国产网站在线免费观看| 亚洲人成电影福利在线播放 | 亚洲人成77777在线观看网| 8x成人永久免费视频| 日韩欧美亚洲国产精品字幕久久久 | xvideos亚洲永久网址| 蜜芽亚洲av无码一区二区三区| 黑人大战亚洲人精品一区| 成人无遮挡裸免费视频在线观看 | 亚洲一级免费视频| 美女视频黄频a免费大全视频| 亚洲高清在线视频| 国产一级一片免费播放i| 真实国产乱子伦精品免费| www成人免费视频| 亚洲一区二区三区国产精华液| 国产精品亚洲аv无码播放| 国产成人精品免费直播| 久久福利资源网站免费看| 国产成年无码久久久免费| 亚洲AV无码一区东京热| 日本免费网站视频www区| 中文字幕免费在线观看动作大片| 亚洲AV性色在线观看| 亚洲一区电影在线观看| 亚洲国产精品lv| 国产亚洲精品福利在线无卡一|