MySQL性能調優——索引詳解與索引的優化

——索引優化,能夠說是數據庫相關優化、理解尤爲是查詢優化中最經常使用的優化手段之一。因此,只有深刻索引的實現原理、存儲方式、不一樣索引間區別,才能設計或使用最優的索引,最大幅度的提高查詢效率!php

 B tree(b- tree) 和 B+tree

至關於一個節點能夠有大於2個子節點的二叉查找數。html

B tree :是一種自平衡數,可以保持數據有序(每一層都有序),查找、刪除、插入時間爲O(logn)。全部葉子節點都在一層,跟記錄有關的信息會放在每個節點,因此查找一個記錄跟二叉查找樹同樣,從根遍歷。非葉子節點能夠擁有可變數量的子節點(數量範圍事先定好),當插入或刪除致使超出範圍,可能會分離或者合併。面試

B+ tree :可以保持數據有序(每一層都有序),查找、刪除、插入時間爲O(logn)。全部葉子節點都在一層,跟記錄有關的信息都放在葉子節點上,非葉子節點只存放索引,且將葉子節點經過指針鏈接在一塊兒,造成一條鏈表。因此對整棵樹的遍歷只要一次線性遍歷葉子節點便可。算法

查找[編輯]

查找以典型的方式進行,相似於二叉查找樹。起始於根節點,自頂向下遍歷樹,選擇其分離值在要查找值的任意一邊的子指針。在節點內部典型的使用是二分查找來肯定這個位置。sql

插入[編輯]

節點要處於違規狀態,它必須包含在可接受範圍以外數目的元素。數據庫

  1. 首先,查找要插入其中的節點的位置。接着把值插入這個節點中。
  2. 若是沒有節點處於違規狀態則處理結束。
  3. 若是某個節點有過多元素,則把它分裂爲兩個節點,每一個都有最小數目的元素。在樹上遞歸向上繼續這個處理直到到達根節點,若是根節點被分裂,則建立一個新根節點。爲了使它工做,元素的最小和最大數目典型的必須選擇爲使最小數不小於最大數的一半。

刪除[編輯]

  1. 首先,查找要刪除的值。接着從包含它的節點中刪除這個值。
  2. 若是沒有節點處於違規狀態則處理結束。
  3. 若是節點處於違規狀態則有兩種可能狀況:
    1. 它的兄弟節點,就是同一個父節點的子節點,能夠把一個或多個它的子節點轉移到當前節點,而把它返回爲合法狀態。若是是這樣,在更改父節點和兩個兄弟節點的分離值以後處理結束。
    2. 它的兄弟節點因爲處在低邊界上而沒有額外的子節點。在這種狀況下把兩個兄弟節點合併到一個單一的節點中,並且咱們遞歸到父節點上,由於它被刪除了一個子節點。持續這個處理直到當前節點是合法狀態或者到達根節點,在其上根節點的子節點被合併並且合併後的節點成爲新的根節點。

1、B+Tree索引數據結構

一、概述架構

Mysql數據庫中使用最頻繁的索引類型,基本全部存儲引擎都支持BTree索引。正是其優異的檢索表現,才使其有這樣的地位。優化

二、存儲結構spa

正如其名,這類索引的物理文件大多就是以BTree結構來存儲的,但會有不一樣的存儲引擎在使用BTree索引時,對存儲結構稍做修改,好比MyISAM存儲引擎,使用B+Tree的數據結構,它相對與BTree結構,全部的數據都存放在葉子節點上,且把葉子節點經過指針鏈接到一塊兒,造成了一條數據鏈表,以加快相鄰數據的檢索效率。

(對B樹、B+樹不熟悉的,可參看博客索引基礎——B-Tree、B+Tree、紅黑樹、B*Tree數據結構 或《算法導論》)

 

另外,對於innoDB存儲引擎,雖然一樣使用B+Tree做爲索引的存儲結構,但具體實現卻與MyISAM大相徑庭,這也是做爲MyISAM與InnoDB存儲引擎的一個重要區別反覆被面試官問到。(關於MyISAM與InnoDB存儲引擎可參看博客MySQL架構設計——MyISAM存儲引擎與InnoDB存儲引擎

 

(1)MyISAM引擎索引結構的葉子節點的數據域,存放的並非實際的數據記錄,而是數據記錄的地址。索引文件與數據文件分離,這樣的索引稱爲「非聚簇索引」。MyISAM的主索引與輔助索引區別並不大,只是主鍵索引不能有重複的關鍵字。

以下圖所示爲非聚簇索引的主鍵索引:

其檢索算法:先按照B+Tree的檢索算法檢索,找到指定關鍵字,則取出對應數據域的值,做爲地址取出數據記錄。

(2)InnoDB引擎索引結構的葉子節點的數據域,存放的就是實際的數據記錄(對於主索引,此處會存放表中全部的數據記錄;對於輔助索引此處會引用主鍵,檢索的時候經過主鍵到主鍵索引中找到對應數據行),或者說,InnoDB的數據文件自己就是主鍵索引文件,這樣的索引被稱爲「聚簇索引」,一個表只能有一個聚簇索引。

以下圖所示爲聚簇索引的主鍵索引:

 

 

 MySQL中只有memory支持Hash索引

參考:https://blog.csdn.net/zhangliangzi/article/details/51366345

相關文章
相關標籤/搜索