1. 程式人生 > >深入瞭解MySQL的索引(一)

深入瞭解MySQL的索引(一)

(一)關於儲存引擎       

       建立合適的索引是SQL效能調優中最重要的技術之一。在學習建立索引之前,要先了解MySql的架構細節,包括在硬碟上面如何組織的,索引和記憶體用法和操作方式,以及儲存引擎的差異如何影響到索引的選擇。

       MySQL有很多種衍生版本,這些衍生版本支援更多不同種類的儲存引擎。本文主要討論三種MySQL引擎。

       MyISAM 一種非事務性的儲存引擎,是MySQL 5.5之前版本預設的儲存引擎。

       InnoDB  最流行的事務性儲存引擎,從5.5版開始成為MySQL預設的引擎。

       Memory 基於記憶體的,非事務性的以及非永續性的儲存引擎。

       注意:

        從5.5版本開始,MySQL表的預設儲存引擎從MyISAM換成InnoDB,將會使使用者安裝那些依賴預設設定或者專門為MyISAM編寫的軟體包時帶來很大的影響。

(二)MySQL索引型別

        MySQL支援在所有關係資料庫表中建立主鍵、唯一鍵、不唯一的非主碼索引等多種型別的索引。此外MySQL還支援純文字和空間索引型別。

       MySQL內建的儲存引擎對各種索引技術有不同的實現方式,包括:B-樹,B+樹,R-樹以及雜湊型別。

       索引資料結構理論:

       1.B-樹

   B-樹中有兩種節點型別:索引節點和葉子節點。葉子節點是用來儲存資料的,而索引節點則用來告訴使用者儲存在葉子節點中的資料順序,並幫助使用者找到相應的資料。

       B-樹的搜尋,從根節點開始,對節點內的關鍵字有序進行二分查詢,如果命中則結束,否則進入查詢關鍵字所屬範圍的兒子節點,重複。直到所對應的兒子指標為空,或已經是葉子節點。

       B-樹是一種多路搜尋樹:

       (1). 定義任意非葉子節點最多有M個兒子,且M>2;

       (2). 根節點的兒子數為[2,M];

       (3). 除根節點以外的非葉子節點的兒子數為[M/2,M];

       (4). 每個節點存放至少M/2-1(取上整)和至多M-1個關鍵字;

       (5). 非葉子節點的關鍵字個數=指向兒子節點的指標的個數-1;  

       (6). 非葉子節點的關鍵字:k[i]<k[i+1];

       (7). 非葉子節點的指標:p[1],p[2],·····,p[M];其中p[1]指向的關鍵字小於k[1]的子樹,p[M]指向的關鍵字大於K[m-1]的子樹;

       (8). 所有的葉子節點位於同一層; 

      2.B+樹

   B+樹資料結構是B-樹實現的增強版本。儘管B+樹支援B-樹索引的所有特性,它們之間最顯著的不同點在於B+樹中底層資料是根據被提及的索引列進行排序的。B+樹還通過葉子節點之間的附加引用來優化掃描效能。

       B+搜尋和B-搜尋不同,區別是B+樹只有達到葉子節點才命中(B-樹可以在非葉子節點命中),其效能等價於關鍵字全集做一次二分搜尋。

      B+樹的特性:

     (1)所有關鍵字都出現在葉子節點的連結串列中,葉子節點相當於儲存資料的資料層。

     (2)不可能在非葉子節點上命中。

     (3)非葉子節點相當於是葉子節點的索引,葉子節點相當於資料層。

     3.雜湊

散列表資料結構是一種很簡單的概念,它將一種演算法應用到給定值中以在底層資料儲存系統中返回一個唯一的指標或位置。散列表的優點是始終以線性時間複雜度找到需要讀取的行的位置,而不像B-樹那樣需要橫跨多層節點來確定位置。

     4.通訊R-樹

    R-樹資料結構支援基於資料型別對幾何資料進行管理。目前只有MyISAM使用R-樹實現支援空間索引,使用空間索引也有很多限制,比如只支援唯一的NOT NULL列等。

    5.全文字

全文字結構也是一種MySQL採用的基本資料結構。這種資料結構目前只有當前版本MySQL中的MyISAM儲存引擎支援。5.6版本將要在InnoDB儲存引擎中加入全文字功能。全文字索引在大型系統中並沒有什麼實用的價值,因為大規模系統有很多專門的檔案檢索產品。所以不用在介紹。