前言
前面提到的innodb的頁目錄就是聚簇索引的一部分,但當有無數個頁的資料,頁目錄無法降低查詢的複雜度,所以引入了更加合適的索引:
採用b+樹建立索引
常見的innodb儲存引擎就採用b+樹建立聚簇索引和二級索引。
b+樹的特點:
1、最底層葉子節點,存放資料。(innodb存放真實的一行資料,myisam存放一行資料的位址)
2、非葉子節點存放目錄項,作為索引,通過分層來降低搜尋量(類似於二分查詢)
3、所有節點按照索引鍵大小排序,構成乙個雙向鍊錶,加速查詢
聚簇索引和二級索引
聚簇索引:
常叫主鍵索引,比如innodb,聚簇索引的葉子節點對應的就是實際的一行資料,由於資料在物理上是乙份,所以聚簇索引只能有乙個。聚簇索引的索引鍵就是資料表的主鍵,如果沒有主鍵會選擇乙個沒有null值的唯一列。
二級索引:
就是常說的普通索引、非聚簇索引,它是與聚簇索引配合使用的,它的b+樹的葉子節點存放的是對應資料的主鍵。查詢的時候先獲取資料的主鍵,再根據主鍵獲取實際的資料(這個過程就是回表)。
為了提高查詢速度,二級索引是不是建的越多越好?
不是,建立二級索引要考慮建立索引的代價,主要看維護代價、空間代價和回表代價。
維護代價:資料在增加,刪除,修改時不僅要修改聚簇索引,還需要維護二級索引,降低效率。(在某些分布式場景,需要維護的就是索引表)
空間代價:占用儲存空間,二級索引儲存了對應列的值和主鍵,占用空間
回表代價:查完二級索引還需要回表
索引覆蓋
它的意思是查詢資料的時候,索引本身已經「覆蓋」了需要的資料,不需要回表查詢了。
前面說了,二級索引儲存了對應列的值和主鍵,如果我只查詢索引的對應列,是不是可以直接取索引的資料,而不需要回表了。這也就是為什麼建議使用select 具體列,不使用select * 的其中乙個原因。
比如
select name from person where name=
'name1'
如果person表建立name列的索引,同時執行計畫走了name列索引的話,就不需要回表了。 聚簇索引與非聚簇索引(二級索引)的區別
聚簇索引 將資料儲存與索引放在一塊,找到索引也就找到了資料。非聚簇索引 將資料儲存與索引分開,索引結構的葉子節點指向資料的對應行。myisam通過key buffer把索引先快取在記憶體中,訪問資料時,在記憶體中直接搜尋索引,然後通過索引找到磁碟對應資料。注意 innodb中,在聚簇索引之上建立的索...
mysql二級索引需要回表 聚簇索引和二級索引
innodb中,在聚簇索引之上建立的索引稱之為輔助索引,非聚簇索引都是輔助索引 innodb引擎通過搜尋樹方式實現索引,索引型別分為主鍵索引 聚集索引 和 二級索引 非主鍵索引 主鍵索引樹中,葉子結點儲存著主鍵即對應行的全部資料 二級索引樹中,葉子結點儲存著索引值和主鍵值 先通過普通索引定位到主鍵值...
聚簇索引和非聚簇索引
一 聚簇索引 clustered indexes 的使用 聚簇索引是一種對磁碟上實際資料重新組織以按指定的乙個或多個列的值排序。由於聚簇索引的索引頁面指標指向資料頁面,所以使用聚簇索引查詢資料幾 乎總是比使用非聚簇索引快。每張表只能建乙個聚簇索引,並且建聚簇索引需要至少相當該錶120 的附加空間,以...