一分鐘明白MySQL聚簇索引和非聚簇索引html
MySQL的InnoDB索引數據結構是B+樹,主鍵索引葉子節點的值存儲的就是MySQL的數據行,普通索引的葉子節點的值存儲的是主鍵值,這是瞭解聚簇索引和非聚簇索引的前提數據庫
什麼是聚簇索引?
很簡單記住一句話:找到了索引就找到了須要的數據,那麼這個索引就是聚簇索引,因此主鍵就是聚簇索引,修改聚簇索引其實就是修改主鍵。
數據結構
什麼是非聚簇索引?
索引的存儲和數據的存儲是分離的,也就是說找到了索引但沒找到數據,須要根據索引上的值(主鍵)再次回表查詢,非聚簇索引也叫作輔助索引。
url
clustered index(MySQL官方對聚簇索引的解釋)
The InnoDB term for a primary key index. InnoDB table storage is organized based on the values of the primary key columns, to speed up queries and sorts involving the primary key columns. For best performance, choose the primary key columns carefully based on the most performance-critical queries. Because modifying the columns of the clustered index is an expensive operation, choose primary columns that are rarely or never updated.
注意標黑的那段話,聚簇索引就是主鍵的一種術語
.net
一個例子
下面咱們建立了一個學生表,作三種查詢,來講明什麼狀況下是聚簇索引,什麼狀況下不是。
code
create table student (orm
id bigint, no varchar(20) , name varchar(20) , address varchar(20) , PRIMARY KEY (`branch_id`) USING BTREE, UNIQUE KEY `idx_no` (`no`) USING BTREE
)ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC;
第一種,直接根據主鍵查詢獲去全部字段數據,此時主鍵時聚簇索引,由於主鍵對應的索引葉子節點存儲了id=1的全部字段的值。
htm
select * from student where id = 1
第二種,根據編號查詢編號和名稱,編號自己是一個惟一索引,但查詢的列包含了學生編號和學生名稱,當命中編號索引時,該索引的節點的數據存儲的是主鍵ID,須要根據主鍵ID從新查詢一次,因此這種查詢下no不是聚簇索引
blog
select no,name from student where no = 'test'
第三種,咱們根據編號查詢編號(有人會問知道編號了還要查詢?要,你可能須要驗證該編號在數據庫中是否存在),這種查詢命中編號索引時,直接返回編號,由於所須要的數據就是該索引,不須要回表查詢,這種場景下no是聚簇索引
索引
select no from student where no = 'test'
總結
主鍵必定是聚簇索引,MySQL的InnoDB中必定有主鍵,即使研發人員不手動設置,則會使用unique索引,沒有unique索引,則會使用數據庫內部的一個行的id來看成主鍵索引,其它普通索引須要區分SQL場景,當SQL查詢的列就是索引自己時,咱們稱這種場景下該普通索引也能夠叫作聚簇索引,MyisAM引擎沒有聚簇索引。