索引該如何設(shè)計(jì)才高效? |
發(fā)布時(shí)間: 2012/6/24 17:21:49 |
索引該如何設(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”范疇,再看到我們所需是否在藏。由于我們少說(shuō)了一個(gè)“計(jì)算機(jī)類”,朋友就必須到每一個(gè)大類去尋找。 所以,我們應(yīng)該盡量讓查找條件盡可能多的在索引中,盡可能通過(guò)索引完成所有過(guò)濾,回表只是取出額外的數(shù)據(jù)字段。 如果我們是這樣說(shuō)的:“幫我確認(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或者其他開(kāi)發(fā)語(yǔ)言的),然后再排除非計(jì)算機(jī)類的(雖然可能并沒(méi)有必要),然后才能確認(rèn)。 所以,字段的順序?qū)M合索引效率有至關(guān)重要的作用,過(guò)濾效果越好的字段需要更靠前。 如果我們還有這樣一個(gè)需求(雖然基本不可能):“幫我將圖書館中所有的計(jì)算機(jī)圖書借來(lái)”。朋友如果通過(guò)索引來(lái)找,每次都到索引柜找到計(jì)算機(jī)書籍所在的區(qū)域,然后從書架上搬下一格(假設(shè)只能以一格為單位從書架上取下,類比數(shù)據(jù)庫(kù)中以block/page為單位讀取),取出第一本,然后再?gòu)乃饕裾业接?jì)算機(jī)圖書所在區(qū)域,再搬下一格,取出一本… 如此往復(fù)直至取完所有的書。如果他不通過(guò)索引來(lái)找又會(huì)怎樣呢?他需要從地一個(gè)書架一直往后找,當(dāng)找到計(jì)算機(jī)的書,搬下一格,取出所有計(jì)算機(jī)的書,再往后,直至所有書架全部看一遍。在這個(gè)過(guò)程中,如果計(jì)算機(jī)類書籍較多,通過(guò)索引來(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ù)量的比例較大抑或者說(shuō)索引的過(guò)濾效果并不是太好的時(shí)候,使用索引并不一定優(yōu)于全表掃描。 如果我們的朋友不知道“數(shù)據(jù)庫(kù)”這個(gè)類別可以屬于“計(jì)算機(jī)”這個(gè)大類,抑或者圖書館的索引系統(tǒng)中這兩個(gè)類別屬性并沒(méi)有關(guān)聯(lián)關(guān)系,又會(huì)怎樣呢?也就是說(shuō),朋友得到的是2個(gè)獨(dú)立的索引,一個(gè)是告知“計(jì)算機(jī)”這個(gè)大類所在的區(qū)域,一個(gè)是“數(shù)據(jù)庫(kù)”這個(gè)小類所在的區(qū)域(很可能是多個(gè)區(qū)域),那么他只能二者選其一來(lái)搜索我的需求。即使朋友可以分別通過(guò)2個(gè)索引檢索然后自己在腦中取交集再找,那這樣的效率實(shí)際過(guò)程中也會(huì)比較低下。 所以,在實(shí)際使用過(guò)程中,一次數(shù)據(jù)訪問(wèn)一般只能利用到1個(gè)索引,這一點(diǎn)在索引創(chuàng)建過(guò)程中一定要注意,不是說(shuō)一條SQL語(yǔ)句中Where子句里面每個(gè)條件都有索引能對(duì)應(yīng)上就可以了 本文出自:億恩科技【1tcdy.com】 服務(wù)器租用/服務(wù)器托管中國(guó)五強(qiáng)!虛擬主機(jī)域名注冊(cè)頂級(jí)提供商!15年品質(zhì)保障!--億恩科技[ENKJ.COM] |