久久精品人人爽,华人av在线,亚洲性视频网站,欧美专区一二三

MySQL數據庫索引為什么能提高數據訪問性能

175次閱讀
沒有評論

共計 2620 個字符,預計需要花費 7 分鐘才能閱讀完成。

這篇文章主要講解了“MySQL 數據庫索引為什么能提高數據訪問性能”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著丸趣 TV 小編的思路慢慢深入,一起來研究和學習“MySQL 數據庫索引為什么能提高數據訪問性能”吧!

索引為什么能提高數據訪問性能?
很多人只知道索引能夠提高數據庫的性能,但并不是特別了解其原理,其實我們可以用一個生活中的示例來理解。
我們讓一位不太懂計算機的朋友去圖書館確認一本叫做《MySQL 性能調優與架構設計》的書是否在藏,這樣對他說:“請幫我借一本計算機類的數據庫書籍,是屬于 MySQL 數據庫范疇的,叫做《MySQL 性能調優與架構設計》”。朋友會根據所屬類別,前往存放“計算機”書籍區域的書架,然后再尋找“數據庫”類存放位置,再找 到一堆講述“MySQL”的書籍,最后可能發現目標在藏 (也可能已經借出不在書架上)。
在這個過程中:“計算機”-“數據庫”-“MySQL”-“在藏”-《MySQL 性能調優與架構設計》其實就是一個“根據索引查找數 據”的典型案例,“計算機”-“數據庫”-“MySQL”-“在藏”就是朋友查找書籍的索引。
假設沒有這個 索引,那查找這本書的過程會變成怎樣呢? 朋友只能從圖書館入口一個書架一個書架的“遍歷”,直到找到《MySQL 性能調優與架構設計》這本書為止。如果幸 運,可能在第一個書架就找到。但如果不幸呢,那就慘了,可能要將整個圖書館所有的書架都找一遍才能找到我們想要的這本書。
注:這個例子 中的“索引”是記錄在朋友大腦中的,實際上,每個圖書館都會有一個非常全的實際存在的索引系統(大多位于入口顯眼處),由很多個貼上了明顯標簽的小抽屜構 成。這個索引系統中存放這非常齊全詳盡的索引數據,標識出我們需要查找的“目標”在某個區域的某個書架上。而且每當有新的書籍入庫,舊的書籍銷毀以及書記 信息修改,都需要對索引系統進行及時的修正。
下面我們通過上面這個生活中的小示例,來分析一下索引,看看能的出哪些結論?
索引有哪些“副作用”?
圖書的變更(增,刪,改) 都需要修訂索引,索引存在額外的維護成本
查找翻閱索引系統需要消耗時間,索引存在額外的訪問成本
這個索引系統需要一個地方來存放,索引存在額外的空間成本
索引是不是越多越好?
如果我們的這個圖書館只是一個進出中轉站,里面的新書進來后很快就會轉發去其他圖書館而從這個館藏中“清除”,那我們的索引就只會不斷的修改,而很少會被用來查找圖書
所以,對于類似于這樣的存在非常大更新量的數據,索引的維護成本會非常高,如果其檢索需求很少,而且對檢索效率并沒有非常高的要求的時候,我們并不建議創建索引,或者是盡量減少索引。
如果我們的書籍量少到只有幾本或者就只有一個書架,索引并不會帶來什么作用,甚至可能還會浪費一些查找索引所花費的時間。
所以,對于數據量極小到通過索引檢索還不如直接遍歷來得快的數據,也并不適合使用索引。
如果我們的圖書館只有一個 10 平方的面積,現在連放書架都已經非常擁擠,而且館藏還在不斷增加,我們還能考慮創建索引嗎?
所以,當我們連存儲基礎數據的空間都捉襟見肘的時候,我們也應該盡量減少低效或者是去除索引。
索引該如何設計才高效?
如果我們僅僅只是這樣告訴對方的:“幫我確認一本數據庫類別的講述 MySQL 的叫做《MySQL 性能調優與架構設計》的書是否在藏”,結果又會如何呢? 朋友只能一個大類區域一個大類區域的去尋找“數據庫”類別,然后再找到“MySQL”范疇,再看到我們所需是否在藏。由于我們少說了一個“計算機類”,朋友就必須到每一個大類去尋找。
所以,我們應該盡量讓查找條件盡可能多的在索引中,盡可能通過索引完成所有過濾,回表只是取出額外的數據字段。
如果我們是這樣說的:“幫我確認一本講述 MySQL 的數據庫范疇的計算機叢書,叫做《MySQL 性能調優與架構設計》,看是否在藏”。如果這位朋友并不知道計算機是一個大類,也不知道數據庫屬于計算機大 類,那這位朋友就悲劇了。首先他得遍歷每個類別確認“MySQL”存在于哪些類別中,然后從包含“MySQL”書籍中再看有哪些是“數據庫”范疇的(有可能部分是講述 PHP 或者其他開發語言的),然后再排除非計算機類的(雖然可能并沒有必要),然后才能確認。
所以,字段的順序對組合索引效率有至關重要的作用,過濾效果越好的字段需要更靠前。
如果我們還有這樣一個需求(雖然基本不可能):“幫我將圖書館中所有的計算機圖書借來”。朋友如果通過索引來找,每次都到索引柜找到計算機書籍所在的區 域,然后從書架上搬下一格(假設只能以一格為單位從書架上取下,類比數據庫中以 block/page 為單位讀取),取出第一本,然后再從索引柜找到計算機 圖書所在區域,再搬下一格,取出一本 hellip; 如此往復直至取完所有的書。如果他不通過索引來找又會怎樣呢? 他需要從地一個書架一直往后找,當找到計算機的書,搬下一格,取出所有計算機的書,再往后,直至所有書架全部看一遍。在這個過程中,如果計算機類書籍較多,通過索引來取所花費的時間很可能要大于直接遍歷,因為不斷往復的索引翻閱所消耗的時間會非 常長。(延伸閱讀:這里有一篇以前寫的關于 Oracle 的文章,索引掃描還是全表掃描(Index Scan Or Full Table Scan))
所以,當我們需要讀取的數據量占整個數據量的比例較大抑或者說索引的過濾效果并不是太好的時候,使用索引并不一定優于全表掃描。
如果我們的朋友不知道“數據庫”這個類別可以屬于“計算機”這個大類,抑或者圖書館的索引系統中這兩個類別屬性并沒有關聯關系,又會怎樣呢? 也就是說,朋友得到的是 2 個獨立的索引,一個是告知“計算機”這個大類所在的區域,一個是“數據庫”這個小類所在的區域(很可能是多個區域),那么他只能二者選其一 來搜索我的需求。即使朋友可以分別通過 2 個索引檢索然后自己在腦中取交集再找,那這樣的效率實際過程中也會比較低下。
所以,在實際使用過程中,一次數據訪問一般只能利用到 1 個索引,這一點在索引創建過程中一定要注意,不是說一條 SQL 語句中 Where 子句里面每個條件都有索引能對應上就可以了。

感謝各位的閱讀,以上就是“MySQL 數據庫索引為什么能提高數據訪問性能”的內容了,經過本文的學習后,相信大家對 MySQL 數據庫索引為什么能提高數據訪問性能這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是丸趣 TV,丸趣 TV 小編將為大家推送更多相關知識點的文章,歡迎關注!

正文完
 
丸趣
版權聲明:本站原創文章,由 丸趣 2023-07-28發表,共計2620字。
轉載說明:除特殊說明外本站除技術相關以外文章皆由網絡搜集發布,轉載請注明出處。
評論(沒有評論)
主站蜘蛛池模板: 洛浦县| 永兴县| 淮滨县| 甘南县| 固镇县| 伊通| 康乐县| 东丽区| 武乡县| 页游| 若尔盖县| 无锡市| 安岳县| 余庆县| 东乌珠穆沁旗| 临邑县| 宣威市| 宁国市| 达孜县| 马公市| 九江市| 文登市| 东兴市| 德清县| 新兴县| 商洛市| 时尚| 西城区| 文成县| 黄浦区| 穆棱市| 虹口区| 东乌珠穆沁旗| 厦门市| 达州市| 尉氏县| 孟州市| 广宗县| 天气| 株洲县| 高阳县|