索引該如何設計才高效? |
發(fā)布時間: 2012/6/24 17:21:49 |
索引該如何設計才高效?
如果我們僅僅只是這樣告訴對方的:“幫我確認一本數(shù)據(jù)庫類別的講述 MySQL 的叫做《MySQL性能調(diào)優(yōu)與架構(gòu)設計》的書是否在藏”,結(jié)果又會如何呢?朋友只能一個大類區(qū)域一個大類區(qū)域的去尋找“數(shù)據(jù)庫”類別,然后再找到 “MySQL”范疇,再看到我們所需是否在藏。由于我們少說了一個“計算機類”,朋友就必須到每一個大類去尋找。 所以,我們應該盡量讓查找條件盡可能多的在索引中,盡可能通過索引完成所有過濾,回表只是取出額外的數(shù)據(jù)字段。 如果我們是這樣說的:“幫我確認一本講述 MySQL 的數(shù)據(jù)庫范疇的計算機叢書,叫做《MySQL性能調(diào)優(yōu)與架構(gòu)設計》,看是否在藏”。如果這位朋友并不知道計算機是一個大類,也不知道數(shù)據(jù)庫屬于計算機大類,那這位朋友就悲劇了。首先他得遍歷每個類別確認“MySQL”存在于哪些類別中,然后從包含 “MySQL” 書籍中再看有哪些是“數(shù)據(jù)庫”范疇的(有可能部分是講述PHP或者其他開發(fā)語言的),然后再排除非計算機類的(雖然可能并沒有必要),然后才能確認。 所以,字段的順序?qū)M合索引效率有至關重要的作用,過濾效果越好的字段需要更靠前。 如果我們還有這樣一個需求(雖然基本不可能):“幫我將圖書館中所有的計算機圖書借來”。朋友如果通過索引來找,每次都到索引柜找到計算機書籍所在的區(qū)域,然后從書架上搬下一格(假設只能以一格為單位從書架上取下,類比數(shù)據(jù)庫中以block/page為單位讀取),取出第一本,然后再從索引柜找到計算機圖書所在區(qū)域,再搬下一格,取出一本… 如此往復直至取完所有的書。如果他不通過索引來找又會怎樣呢?他需要從地一個書架一直往后找,當找到計算機的書,搬下一格,取出所有計算機的書,再往后,直至所有書架全部看一遍。在這個過程中,如果計算機類書籍較多,通過索引來取所花費的時間很可能要大于直接遍歷,因為不斷往復的索引翻閱所消耗的時間會非常長。(延伸閱讀:這里有一篇以前寫的關于Oracle的文章,索引掃描還是全表掃描(Index Scan Or Full Table Scan)) 所以,當我們需要讀取的數(shù)據(jù)量占整個數(shù)據(jù)量的比例較大抑或者說索引的過濾效果并不是太好的時候,使用索引并不一定優(yōu)于全表掃描。 如果我們的朋友不知道“數(shù)據(jù)庫”這個類別可以屬于“計算機”這個大類,抑或者圖書館的索引系統(tǒng)中這兩個類別屬性并沒有關聯(lián)關系,又會怎樣呢?也就是說,朋友得到的是2個獨立的索引,一個是告知“計算機”這個大類所在的區(qū)域,一個是“數(shù)據(jù)庫”這個小類所在的區(qū)域(很可能是多個區(qū)域),那么他只能二者選其一來搜索我的需求。即使朋友可以分別通過2個索引檢索然后自己在腦中取交集再找,那這樣的效率實際過程中也會比較低下。 所以,在實際使用過程中,一次數(shù)據(jù)訪問一般只能利用到1個索引,這一點在索引創(chuàng)建過程中一定要注意,不是說一條SQL語句中Where子句里面每個條件都有索引能對應上就可以了 本文出自:億恩科技【mszdt.com】 |