MySQL資料庫效能優化之索引優化

2022-04-05 06:57:28 字數 2036 閱讀 1370

大家都知道索引對於資料訪問的效能有非常關鍵的作用,都知道索引可以提高資料訪問效率。

為什麼索引能提高資料訪問效能?他會不會有「***」?是不是索引建立越多,效能就越好?到底該如何設計索引,才能最大限度的發揮其效能?

這篇文章主要是帶著上面這幾個問題來做乙個簡要的分析,同時排除了業務場景所帶來的特殊性,請不要糾結業務場景的影響。

索引為什麼能提高資料訪問效能?

很多人只知道索引能夠提高資料庫的效能,但並不是特別了解其原理,其實我們可以用乙個生活中的示例來理解。

我們讓一位不太懂計算機的朋友去圖書館確認一本叫做《mysql效能調優與架構設計》的書是否在藏,這樣對他說:「請幫我借一本計算機類的資料庫書籍,是屬於 mysql 資料庫範疇的,叫做《mysql效能調優與架構設計》」。朋友會根據所屬類別,前往存放「計算機」書籍區域的書架,然後再尋找「資料庫」類存放位置,再找到一堆講述「mysql」的書籍,最後可能發現目標在藏(也可能已經借出不在書架上)。

在這個過程中: 「計算機」->「資料庫」->「mysql」->「在藏」->《mysql效能調優與架構設計》其實就是乙個「根據索引查詢資料」的典型案例,「計算機」->「資料庫」->「mysql」->「在藏」 就是朋友查詢書籍的索引。

假設沒有這個索引,那查詢這本書的過程會變成怎樣呢?朋友只能從圖書館入口乙個書架乙個書架的「遍歷」,直到找到《mysql效能調優與架構設計》這本書為止。如果幸運,可能在第乙個書架就找到。但如果不幸呢,那就慘了,可能要將整個圖書館所有的書架都找一遍才能找到我們想要的這本書。

注:這個例子中的「索引」是記錄在朋友大腦中的,實際上,每個圖書館都會有乙個非常全的實際存在的索引系統(大多位於入口顯眼處),由很多個貼上了明顯標籤的小抽屜構成。這個索引系統中存放這非常齊全詳盡的索引資料,標識出我們需要查詢的「目標」在某個區域的某個書架上。而且每當有新的書籍入庫,舊的書籍銷毀以及書記資訊修改,都需要對索引系統進行及時的修正。

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

索引有哪些「***」?

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

查詢翻閱索引系統需要消耗時間,索引存在額外的訪問成本

這個索引系統需要乙個地方來存放,索引存在額外的空間成本

索引是不是越多越好?

如果我們的這個圖書館只是乙個進出中轉站,裡面的新書進來後很快就會**去其他圖書館而從這個館藏中「清除」,那我們的索引就只會不斷的修改,而很少會被用來查詢圖書

所以,對於類似於這樣的存在非常大更新量的資料,索引的維護成本會非常高,如果其檢索需求很少,而且對檢索效率並沒有非常高的要求的時候,我們並不建議建立索引,或者是儘量減少索引。

如果我們的書籍量少到只有幾本或者就只有乙個書架,索引並不會帶來什麼作用,甚至可能還會浪費一些查詢索引所花費的時間。

所以,對於資料量極小到通過索引檢索還不如直接遍歷來得快的資料,也並不適合使用索引。

如果我們的圖書館只有乙個10平方的面積,現在連放書架都已經非常擁擠,而且館藏還在不斷增加,我們還能考慮建立索引嗎?

所以,當我們連儲存基礎資料的空間都捉襟見肘的時候,我們也應該儘量減少低效或者是去除索引。

索引該如何設計才高效?

如果我們僅僅只是這樣告訴對方的:「幫我確認一本資料庫類別的講述 mysql 的叫做《mysql效能調優與架構設計》的書是否在藏」,結果又會如何呢?朋友只能乙個大類區域乙個大類區域的去尋找「資料庫」類別,然後再找到 「mysql」範疇,再看到我們所需是否在藏。由於我們少說了乙個「計算機類」,朋友就必須到每乙個大類去尋找。

所以,我們應該盡量讓查詢條件盡可能多的在索引中,盡可能通過索引完成所有過濾,回表只是取出額外的資料字段。

如果我們是這樣說的:「幫我確認一本講述 mysql 的資料庫範疇的計算機叢書,叫做《mysql效能調優與架構設計》,看是否在藏」。如果這位朋友並不知道計算機是乙個大類,也不知道資料庫屬於計算機大類,那這位朋友就悲劇了。首先他得遍歷每個類別確認「mysql」存在於哪些類別中,然後從包含 「mysql」 書籍中再看有哪些是「資料庫」範疇的(有可能部分是講述php或者其他開發語言的),然後再排除非計算機類的(雖然可能並沒有必要),然後才能確認。

所以,欄位的順序對組合索引效率有至關重要的作用,過濾效果越好的字段需要更靠前。

MySQL 資料庫效能優化之索引優化

資料庫效能優化專題 系列的第三篇文章 mysql 資料庫效能優化之索引優化 大家都知道索引對於資料訪問的效能有非常關鍵的作用,都知道索引可以提高資料訪問效率。為什麼索引能提高資料訪問效能?他會不會有 是不是索引建立越多,效能就越好?到底該如何設計索引,才能最大限度的發揮其效能?這篇文章主要是帶著上面...

MySQL 資料庫效能優化之索引優化

大家都知道索引對於資料訪問的效能有非常關鍵的作用,都知道索引可以提高資料訪問效率。為什麼索引能提高資料訪問效能?他會不會有 是不是索引建立越多,效能就越好?到底該如何設計索引,才能最大限度的發揮其效能?這篇文章主要是帶著上面這幾個問題來做乙個簡要的分析,同時排除了業務場景所帶來的特殊性,請不要糾結業...

MySQL 資料庫效能優化之索引優化

大家都知道索引對於資料訪問的效能有非常關鍵的作用,都知道索引可以提高資料訪問效率。為什麼索引能提高資料訪問效能?他會不會有 是不是索引建立越多,效能就越好?到底該如何設計索引,才能最大限度的發揮其效能?這篇文章主要是帶著上面這幾個問題來做乙個簡要的分析,同時排除了業務場景所帶來的特殊性,請不要糾結業...