怎么進(jìn)行MySQL性能優(yōu)化中的索引優(yōu)化

本篇文章為大家展示了怎么進(jìn)行MySQL性能優(yōu)化中的索引優(yōu)化,內(nèi)容簡(jiǎn)明扼要并且容易理解,絕對(duì)能使你眼前一亮,通過這篇文章的詳細(xì)介紹希望你能有所收獲。

創(chuàng)新互聯(lián)建站是由多位在大型網(wǎng)絡(luò)公司、廣告設(shè)計(jì)公司的優(yōu)秀設(shè)計(jì)人員和策劃人員組成的一個(gè)具有豐富經(jīng)驗(yàn)的團(tuán)隊(duì),其中包括網(wǎng)站策劃、網(wǎng)頁(yè)美工、網(wǎng)站程序員、網(wǎng)頁(yè)設(shè)計(jì)師、平面廣告設(shè)計(jì)師、網(wǎng)絡(luò)營(yíng)銷人員及形象策劃。承接:成都網(wǎng)站設(shè)計(jì)、網(wǎng)站制作、網(wǎng)站改版、網(wǎng)頁(yè)設(shè)計(jì)制作、網(wǎng)站建設(shè)與維護(hù)、網(wǎng)絡(luò)推廣、數(shù)據(jù)庫(kù)開發(fā),以高性價(jià)比制作企業(yè)網(wǎng)站、行業(yè)門戶平臺(tái)等全方位的服務(wù)。

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

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

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

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

    我們讓一位不太懂計(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è)生活中的小示例,來(lái)分析一下索引,看看能的出哪些結(jié)論?

  • 索引有哪些“副作用”?

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

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

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

  • 索引是不是越多越好?

    1. 如果我們的這個(gè)圖書館只是一個(gè)進(jìn)出中轉(zhuǎn)站,里面的新書進(jìn)來(lái)后很快就會(huì)轉(zhuǎn)發(fā)去其他圖書館而從這個(gè)館藏中“清除”,那我們的索引就只會(huì)不斷的修改,而很少會(huì)被用來(lái)查找圖書
      所以,對(duì)于類似于這樣的存在非常大更新量的數(shù)據(jù),索引的維護(hù)成本會(huì)非常高,如果其檢索需求很少,而且對(duì)檢索效率并沒有非常高的要求的時(shí)候,我們并不建議創(chuàng)建索引,或者是盡量減少索引。

    2. 如果我們的書籍量少到只有幾本或者就只有一個(gè)書架,索引并不會(huì)帶來(lái)什么作用,甚至可能還會(huì)浪費(fèi)一些查找索引所花費(fèi)的時(shí)間。
      所以,對(duì)于數(shù)據(jù)量極小到通過索引檢索還不如直接遍歷來(lái)得快的數(shù)據(jù),也并不適合使用索引。

    3. 如果我們的圖書館只有一個(gè)10平方的面積,現(xiàn)在連放書架都已經(jīng)非常擁擠,而且館藏還在不斷增加,我們還能考慮創(chuàng)建索引嗎?
      所以,當(dāng)我們連存儲(chǔ)基礎(chǔ)數(shù)據(jù)的空間都捉襟見肘的時(shí)候,我們也應(yīng)該盡量減少低效或者是去除索引。

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

    1. 如果我們僅僅只是這樣告訴對(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ù)字段。

    2. 如果我們是這樣說的:“幫我確認(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)重要的作用,過濾效果越好的字段需要更靠前。

    3. 如果我們還有這樣一個(gè)需求(雖然基本不可能):“幫我將圖書館中所有的計(jì)算機(jī)圖書借來(lái)”。朋友如果通過索引來(lái)找,每次都到索引柜找到計(jì)算機(jī)書籍所在的區(qū)域,然后從書架上搬下一格(假設(shè)只能以一格為單位從書架上取下,類比數(shù)據(jù)庫(kù)中以block/page為單位讀?。〕龅谝槐?,然后再?gòu)乃饕裾业接?jì)算機(jī)圖書所在區(qū)域,再搬下一格,取出一本… 如此往復(fù)直至取完所有的書。如果他不通過索引來(lái)找又會(huì)怎樣呢?他需要從地一個(gè)書架一直往后找,當(dāng)找到計(jì)算機(jī)的書,搬下一格,取出所有計(jì)算機(jī)的書,再往后,直至所有書架全部看一遍。在這個(gè)過程中,如果計(jì)算機(jī)類書籍較多,通過索引來(lái)取所花費(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)于全表掃描。

    4. 如果我們的朋友不知道“數(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ū)域),那么他只能二者選其一來(lái)搜索我的需求。即使朋友可以分別通過2個(gè)索引檢索然后自己在腦中取交集再找,那這樣的效率實(shí)際過程中也會(huì)比較低下。
      所以,在實(shí)際使用過程中,一次數(shù)據(jù)訪問一般只能利用到1個(gè)索引,這一點(diǎn)在索引創(chuàng)建過程中一定要注意,不是說一條SQL語(yǔ)句中Where子句里面每個(gè)條件都有索引能對(duì)應(yīng)上就可以了。

上述內(nèi)容就是怎么進(jìn)行MySQL性能優(yōu)化中的索引優(yōu)化,你們學(xué)到知識(shí)或技能了嗎?如果還想學(xué)到更多技能或者豐富自己的知識(shí)儲(chǔ)備,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。

網(wǎng)站名稱:怎么進(jìn)行MySQL性能優(yōu)化中的索引優(yōu)化
文章URL:http://bm7419.com/article2/pcdhic.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站維護(hù)、網(wǎng)站收錄、外貿(mào)網(wǎng)站建設(shè)、動(dòng)態(tài)網(wǎng)站、建站公司、商城網(wǎng)站

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

外貿(mào)網(wǎng)站建設(shè)