mysql中什么是非聚簇索引?

mysql中非聚簇索引是索引的存儲和數據的存儲是分離的,也就是說找到了索引但沒找到數據,需要根據索引上的值即主鍵再次回表查詢,非聚簇索引也叫做輔助索引。

mysql中什么是非聚簇索引?

mysql中非聚簇索引是:

索引的存儲和數據的存儲是分離的,也就是說找到了索引但沒找到數據,需要根據索引上的值(主鍵)再次回表查詢,非聚簇索引也叫做輔助索引。

一個例子

下面我們創建了一個學生表,做三種查詢,來說明什么情況下是聚簇索引,什么情況下不是。

create?table?student?( ????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;

相關學習推薦:mysql視頻教程

第一種,直接根據主鍵查詢獲取所有字段數據,此時主鍵是聚簇索引,因為主鍵對應的索引葉子節點存儲了id=1的所有字段的值。

select?*?from?student?where?id?=?1

?

第二種,根據編號查詢編號和名稱,編號本身是一個唯一索引,但查詢的列包含了學生編號和學生名稱,當命中編號索引時,該索引的節點的數據存儲的是主鍵ID,需要根據主鍵ID重新查詢一次,所以這種查詢下no不是聚簇索引

select?no,name?from?student?where?no?=?'test'

?

第三種,我們根據編號查詢編號(有人會問知道編號了還要查詢?要,你可能需要驗證該編號在數據庫中是否存在),這種查詢命中編號索引時,直接返回編號,因為所需要的數據就是該索引,不需要回表查詢,這種場景下no是聚簇索引

select?no?from?student?where?no?=?'test'

?

總結:

主鍵一定是聚簇索引,MySQL的InnoDB中一定有主鍵,即便研發人員不手動設置,則會使用unique索引,沒有unique索引,則會使用數據庫內部的一個行的id來當作主鍵索引,其它普通索引需要區分SQL場景,當SQL查詢的列就是索引本身時,我們稱這種場景下該普通索引也可以叫做聚簇索引,MyisAM引擎沒有聚簇索引。

以上就是

? 版權聲明
THE END
喜歡就支持一下吧
點贊15 分享