MySQL索引資料結構及演算法原理學習筆記
1、預備知識
(1)儲存介質一般為主存和磁碟
(2)主存(RAM)支援隨機存取,磁碟定址需要定位【磁軌】和【扇區】,對應產生【尋道時間】和【旋轉時間】,因此磁碟的存取速度往往是主存的【幾百分之一】
(3)由於【區域性性原理】的歸納,以及磁碟IO非常耗時,實際情況下磁碟往往不是像主存那樣【隨機】【按需】讀取,而是一次性讀取目標資料【相鄰】的多個【邏輯儲存塊】到記憶體中,這種策略叫做【磁碟預讀】
(4)這個邏輯儲存塊被稱為【頁】,即計算機管理儲存器的邏輯單位。硬體及作業系統往往將主存和磁碟儲存區分割為連續的大小相等的塊,每個儲存塊稱為一頁(大多數OS中頁大小為4K),主存和磁碟以頁為單位交換資料
2、資料庫索引
(1)B-Tree
(2)B+Tree
(3)檢索過程:首先在最上層節點進行二分查詢,如果找不到則去對應左子節點或右子節點進行二分查詢,以此遞迴
(4)B-Tree和B+Tree區別
—內節點不儲存data,只儲存key
—葉子節點不儲存指標(葉節點和內節點大小一般不相同)
—葉子節點具有指向相鄰葉子節點的指標(方便區間訪問)
(5)索引設計思路
—索引本身也很大,不能直接在主存中儲存,而是存在磁碟上。一個好的索引資料結構應該最大程度減少磁碟IO。
—資料庫設計者巧妙地將【樹節點】用【單位頁】進行對應儲存,這樣一個節點的載入只需要一次磁碟IO。在B-Tree定義中,檢索一次最多需要訪問h(樹高度)個節點,相應地最多需要h-1次IO(根節點常駐記憶體),時間複雜度O(h)= O(logdN),h為樹高度,d為單個節點中Key數量,d越大,索引效能越好。一般d比較大,即橫向比較長,h比較小,通常不超過3,因此B-Tree作為索引結構效率非常高。
(6)為什麼不用二叉樹或紅黑樹作為索引資料結構?
h較深,邏輯上相鄰的父子節點在物理上可能很遠,無法利用區域性性
(7)為什麼B+Tree優於B-Tree?
因為d越大,索引效能越好,dmax=floor(pagesize/(keysize+datasize+pointsize)),由於B+Tree內節點去掉了data域,因此可以擁有更大的出度,擁有更好的效能
3、MySQL兩種不同索引實現
3.1 MyISAM索引實現
(1)使用B+Tree
(2)索引檔案和資料檔案獨立
(3)內節點不包含Data域只儲存Key,葉子結點包含Key和Data域(資料記錄地址引用而非【實際資料記錄】)
(4)非聚簇索引
(5)輔助索引獨立與主鍵索引,都在葉子結點儲存資料記錄地址引用
3.2 InnoDB索引實現
(1)使用B+Tree
(2)資料檔案和索引檔案合二為一,即資料檔案本身就是索引檔案,本身就按照B+Tree結構組織
(3)葉子節點包含Key和【實際資料記錄】
(4)資料檔案預設按【主鍵】建立B+Tree結構,因此主鍵最好選擇單調欄位(自增欄位),否則在插入或刪除記錄時會導致B+Tree頻繁分裂
(5)資料檔案不可能既按主鍵組織排序又按其它非主鍵欄位組織排序,因此輔助索引是建立在主鍵索引基礎上,按照輔助索引進行檢索,首先檢索到對應主鍵值,然後再跟進主鍵值定位到具體資料記錄。也正因為此,主鍵索引不應該選擇過長欄位,否則導致輔助索引變得很大
(6)聚簇索引(一個表格只能有一個聚簇索引)
**注意:**MyISAM和InnoDB是兩種不同的資料儲存引擎,由於資料是儲存在表格中,因此MyISAM和InnoDB是描述表格儲存方式而不是整個資料庫。一個數據庫有很多表格,同一個資料庫中的表格可以部分是MyISAM儲存引擎,部分是InnoDB儲存引擎。就某一個表格而言,只能選擇MyISAM或InnoDB其中一種引擎作為實現。當表格選擇MyISAM實現時,表格內非聚簇索引可以有多個,當表格選擇InnoDB實現時,聚簇索引只能有一個!
4、索引使用策略及優化
主鍵和唯一索引區別
(1)主鍵是特殊的唯一索引,唯一索引不一定是主鍵
(2)一個表可以有多個唯一索引,但只能有一個主鍵(可以是聯合主鍵)
(3)主鍵列不允許空值,而唯一索引列允許空值
待學習…..