从物理存储角度进行分类,可分为聚集索引和非聚集索引。
● 聚集索引(又称为一级索引、主索引):聚集索引就是按照聚集索引键构造一棵 B+ 树,表数据存储在 B+ 树叶子节点上,通过定位索引可直接在 B+ 树中找到数据。每一个表有且只有一个聚集索引。
● 非聚集索引(又称为二级索引、辅助索引):将二级索引列和聚集索引列共同存储在 B+ 树叶子节点上。如果查找非聚集索引键值或聚集索引键值可直接在 B+ 树中找到;如果查找索引键值以外的数据,则需要回到一级索引中进行查找。每一个表可以有多个非聚集索引。
下面用一个具体的示例展示聚集索引和聚集索引的用法。检索过程如图 10.1 所示。
//创建表格T1,并插入数据。
CREATE TABLE T1 (ID int,NAME varchar(20),DEPARTMENT varchar(20));
INSERT INTO T1 VALUES(1,'Zhang San', 'A部');
INSERT INTO T1 VALUES(2,'Li Si', 'B部');
INSERT INTO T1 VALUES(3,'Wang Wu', 'C部');
INSERT INTO T1 VALUES(4,'Chen Liu', 'D部');
//创建聚集索引,索引键为ID。
CREATE CLUSTER INDEX C1 on T1(ID);
//创建非聚集索引,索引键为NAME。
CREATE INDEX S1 on T1(NAME);
//使用聚集索引进行查找
EXPLAIN SELECT * FROM T1 WHERE ID=2;
1 #NSET2: [1, 1, 112]
2 #PRJT2: [1, 1, 112]; exp_num(4), is_atom(FALSE)
3 #CSEK2: [1, 1, 112]; scan_type(ASC), C1(T1), scan_range[2,2]
//使用非聚集索引进行查找
EXPLAIN SELECT ID FROM T1 WHERE NAME='Wang Wu';
1 #NSET2: [1, 1, 64]
2 #PRJT2: [1, 1, 64]; exp_num(2), is_atom(FALSE)
3 #SSEK2: [1, 1, 64]; scan_type(ASC), S1(T1), scan_range['Wang Wu','Wang Wu']
//先使用非聚集索引进行查找,再通过非聚集索引关联上聚集索引进行二次查找
EXPLAIN SELECT DEPARTMENT FROM T1 WHERE NAME='Chen Liu';
1 #NSET2: [1, 1, 96]
2 #PRJT2: [1, 1, 96]; exp_num(1), is_atom(FALSE)
3 #BLKUP2: [1, 1, 96]; S1(T1)
4 #SSEK2: [1, 1, 96]; scan_type(ASC), S1(T1), scan_range['Chen Liu','Chen Liu']
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




