聚簇索引並非一種單獨的索引類型,而是一種數據存儲方式(不是數據結構,而是存儲結構),具體細節依賴於其實現方式,但innodb的聚簇索引其實是在同一個結構中保存了BTree(B-Tree ,B+Tree)索引和數據行。數據庫
http://www.javashuo.com/article/p-bnehpfsf-eg.html 這個連接裏介紹了BTree索引數據結構
聚簇索引(clustered index)也稱爲彙集索引,聚類索引,簇集索引,聚簇索引肯定表中數據的物理順序。性能
彙集索引:相似字典的拼音目錄。表中的數據按照彙集索引的規則來存儲的。就像新華字典。整本字典是按照A-Z的順序來排列。這也是一個表只能有一個彙集索引的緣由。由於這個特色,具體索引應該建在那些常常須要order by,group by,按範圍取值的列上。由於數據自己就是按照彙集索引的順序存儲的。不該該建在須要頻繁修改的列上,由於彙集索引的每次改動都覺得這表中數據的物理數據的一次從新排序。
.net
彙集索引默認是按照每張表的主鍵構造一棵B+Tree(平衡查詢樹),樹中的葉子節點存放着表中的行記錄數據,所以,也將彙集索引的葉子節點稱爲數據頁;非葉子節點中存放着僅僅是鍵值和指向葉子節點的偏移量。每一個葉子節點(數據頁)都經過一個雙向鏈表進行鏈接。
因爲實際的數據頁只能按照一棵B+樹進行排序,所以數據庫中每張表只能有一個彙集索引。
彙集索引能過特別快的訪問針對範圍值的查詢。blog
innodb將經過主鍵彙集數據,若是沒有定義主鍵,Innodb會選擇第一個非空的惟一索引代替,若是沒有非空惟一索引,Innodb會隱式定義一個6字節的rowid主鍵來做爲彙集索引。innodb只彙集在同一個頁面中的記錄,包含相鄰鍵值的頁面可能會相距甚遠。排序
要注意:聚簇主鍵可能對性能有幫助,但也可能致使嚴重的性能問題,尤爲是將表的存儲引擎從innodb轉換成其餘引擎的時候。索引