MySQL進階之索引
索引概述
介紹
索引(index)是幫助MySQL高效獲取數據的數據結構(有序)。在數據之外,數據庫系統還維護著滿足 特定查找算法的數據結構,這些數據結構以某種方式引用(指向)數據, 這樣就可以在這些數據結構 上實現高級查找算法,這種數據結構就是索引。
索引就是一種數據結構,這種結構類似,鏈表,樹等等。但是比它們要復雜的多。
為什麼要用索引呢?
假如我們有如下數據
如果我們要查詢年齡=45的全部信息。
select * from tb_user where age = 45;
那麼SQL是如何查詢呢?
MySQL需要進行全表掃描,然後對比每條數據中的age值是否是45。
加入我們要100個數據,那你繼續全表掃描找出age = 45;豈不是太麻煩瞭?
這是你是否想起來數據結構中二叉搜索樹?我們將age的值映射到這個二叉搜索樹上,那麼我們就可以快速查找到我們要的結果。age 到二叉搜索樹的過程就是索引。
註意:我們僅僅用二叉搜索樹舉例子,想信你肯定知道MySQL中的索引肯定比這個復雜。
此時我們對索引的理解更加深入瞭,索引僅僅是建立瞭一個數據結構,把數據存入到這個結構上,方便MySQL查找數據罷瞭。
特點
索引結構
MySQL的索引是在存儲引擎層實現的,不同的存儲引擎有不同的索引結構,主要包含以下幾種
上述是MySQL中所支持的所有的索引結構,接下來,我們再來看看不同的存儲引擎對於索引結構的支持 情況。
我們主要看InnoDB就可以瞭,因為MyISAM會被MongoDB代替,Memory會被Redis代替。
我們一般指的索引是指的是B+tree。
當然B+tree肯定不是一上來就提出來的,肯定是有一個進化的過程。
索引進化的過程
我們都知道二叉搜索樹是一個方便存儲的結構,因為其天然的排序。左子樹都小於中間節點,右子樹都大於中間節點。
但是它有什麼缺點呢?在極端情況下會退化成鏈表。查找時間復雜度O(n),這不就等效於全表查詢瞭?
如何克服呢?使用紅黑樹,因為它是一種平衡二叉樹。可以避免出現鏈表這種極端情況。
那麼是不是使用紅黑樹就可以瞭?答案:還是不行,不夠理想。
為什麼呢?因為是二叉樹,如果MySQL中數據過多,那麼將會出現樹的層級過深。
我們知道數據以Page為單位存入的,在Page切換查詢時會出現磁盤IO操作。層級過深就會造成IO頻繁。
如何解決上述問題呢?B-Tree出場。
B-Tree
B-Tree,B樹是一種多叉路衡查找樹,相對於二叉樹,B樹每個節點可以有多個分支,即多叉。 以一顆最大度數(max-degree)為5(5階)的b-tree為例,那這個B樹每個節點最多存儲4個key(每個key都可以存放數據),5 個指針:
是不是使用b樹就可以瞭呢?原則上是可以瞭,但是還有一種更優的方案B+Tree 代替瞭BTree。
MySQL中的B+Tree 和BTree有什麼不同呢?
- B+Tree隻在葉子節點存儲數據,從而保證每個Page中存入更多的key。
- 葉子節點包含瞭根節點和非葉子節點–圖中紅框顯示。
- 葉子節點采用雙向循環鏈表連接,方便查找。
因此我們可以回答:為什麼MySQL采用B+Tree呢?
到此這篇關於MySQL進階之索引的文章就介紹到這瞭,更多相關MySQL索引內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!