MySQL聚簇索引&彙集索引&索引組織表

MySQL聚簇索引&彙集索引&索引組織表html

http://www.cnblogs.com/hustcat/archive/2009/10/28/1591648.htmlmysql

聚簇索引和彙集索引(Clustered Index)

提及索引,不能不說B+樹。算法

引用:http://blog.codinglabs.org/articles/theory-of-mysql-index.htmlsql

MySQL官方對索引的定義爲:索引(Index)是幫助MySQL高效獲取數據的數據結構。提取句子主幹,就能夠獲得索引的本質:索引是數據結構。數據庫

咱們知道,數據庫查詢是數據庫的最主要功能之一。咱們都但願查詢數據的速度能儘量的快,所以數據庫系統的設計者會從查詢算法的角度進行優化。最基本的查詢算法固然是順序查找(linear search),這種複雜度爲O(n)的算法在數據量很大時顯然是糟糕的,好在計算機科學的發展提供了不少更優秀的查找算法,例如二分查找(binary search),二叉樹查找(binary tree search)等。若是稍微分析一下會發現,每種查找算法都只能應用於特定的數據結構之上,例如二分查找要求被檢索數據有序,而二叉樹查找只能應用於二叉查找樹上,可是數據自己的組織結構不可能徹底知足各類數據結構(例如,理論上不可能同時將兩列都按順序進行組織),因此,在數據以外,數據庫系統還維護着知足特定查找算法的數據結構,這些數據結構以某種方式引用(指向)數據,這樣就能夠在這些數據結構上實現高級查找算法。這種數據結構,就是索引。數據結構

MySQL就廣泛使用B+Tree實現其索引結構。優化

聚簇索引並非一種單獨的索引類型,而是一種數據存儲方式。具體的細節依賴於其實現方式,但InnoDB的聚簇索引實際上在同一個結構中保存了B+Tree索引和數據行。spa

當表有聚簇索引時,他的數據行實際上存放在索引的葉子頁(leaf page)中。術語 「聚簇」表示數據行和相鄰的鍵值緊湊地存儲在一塊兒(這並不是總成立)。設計

由於沒法同時把數據行存放在兩個不一樣的地方,索引一個表只能有一個聚簇索引。htm

注:葉子頁面包含完整的元組,而內節點頁面僅包含索引的列(索引的列爲整型)。一些DBMS容許用戶指定聚簇索引,可是MySQL的存儲引擎到目前爲止都不支持。InnoDB對主鍵創建聚簇索引。若是你不指定主鍵,InnoDB會用一個具備惟一且非空值的索引來代替。若是不存在這樣的索引,InnoDB會定義一個隱藏的主鍵,而後對其創建聚簇索引。通常來講,DBMS都會以聚簇索引的形式來存儲實際的數據,它是其它二級索引的基礎。

 

索引組織表(Index Organized Table, IOT) 

其實和聚簇索引說的是一個意思。

索引組織表(Index organized table, IOT)就是存儲在一個索引結構中的表。與堆組織表無序存儲不一樣的是,IOT中的數據按主鍵存儲和排序。

相比堆組織表,索引組織表可以節省一部分空間,由於使用堆組織表時,咱們必須爲表和表的主鍵上的索引分別留出空間。而IOT則能夠省去主鍵索引的開銷,由於數據就是按順序存儲的,能夠當作索引使。換句話說,若是你只會經過一個表的主鍵來訪問這個表,這個表就適合建立成索引組織表。

舉例:

 1.一個客戶有不少地址信息,客戶是一個表,客戶地址信息是另一個表。讀取一個客戶地址信息的時候,若是這個客戶的全部地址信息都存放在相鄰的地方,讀取速度就會快一些。這個時候,客戶地址信息表適合建立成IOT。

2. 常常查看一支股票的最近幾天的信息,股票信息通常是千萬級別的數據,若是可以把最近幾天的信息存放在一塊兒就會快不少。

=========END=========

相關文章
相關標籤/搜索