深入了解MySQL的索引(一)

耐心看完......

1、關於存儲引擎

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

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

  1. MyISAM 一種非事務性的存儲引擎,是MySQL 5.5之前版本默認的存儲引擎。
  2. InnoDB 最流行的事務性存儲引擎,從5.5版開始成為MySQL默認的引擎。
  3. Memory 基於內存的,非事務性的以及非持久性的存儲引擎。

注意:

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

2、MySQL索引類型

MySQL支持在所有關係數據庫表中創建主鍵、唯一鍵、不唯一的非主碼索引等多種類型的索引。此外MySQL還支持純文本和空間索引類型。

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

索引數據結構理論:

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]

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

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

B+樹

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

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

B+樹的特性:

(1)所有關鍵字都出現在葉子節點的鏈表中,葉子節點相當於存儲數據的數據層。

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

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

散列

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

通信R-樹

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

全文本

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

學習源自:https://mp.weixin.qq.com/s/s21FFC5nvYaOyuUQBRNGNQ


分享到:


相關文章: