Mysql 的 聚簇索引和二级索引

原文地址:《聚簇索引和二级索引》,增加部分补充和理解。

目录​​​​​

1、索引的简述

(1)聚簇索引

(2)非聚簇索引

二级索引(辅助索引)

2、示例

聚簇索引(主键索引)

二级索引(辅助索引)

3、结论

结论一

结论二


------------------------------------------------------------------------————————————————————————————————-

写在前面,针对原博主的讲述,网友提出相应补充,需要注意:

聚簇索引(Clustered indexes)是指索引和数据是在同一个结构里;非聚簇索引(Non-clustered indexes)反之。对于InnoDB和MyISAM引擎中的索引,都分为主键索引(primary key)和二级索引(secondary index);在InnoDb中,强制使用主键作为聚簇索引,B+ Tree叶子节点存储就是主键数据,而二级索引的叶子节点存储的是主键的键值在MyISAM中,主键索引与二级索引没什么区别,都是存储的数据行对应的地址。一般把InnoDB作为聚簇索引的代表、MyISAM作为非聚簇索引的代表,两者进行比较,这就导致了矛盾点,如果将二级索引等价于非聚簇索引,那InnoDB就不能完全代表聚簇索引;但是单从二级索引的存储形式来看,又属于非聚簇索引。

1、索引的简述

(1)聚簇索引和非聚簇索引

聚簇索引:

索引和数据存储在一块( 都存储在同一个B*tree 中)。一般主键索引都是聚餐索引。

非聚簇索引:

索引数据和存储数据是分离的。

(2)主键索引和二级索引

对于InnoDB和MyISAM引擎中的索引,都分为主键索引(primary key)和二级索引(secondary index);
在InnoDb中,强制使用主键作为聚簇索引,B+ Tree叶子节点存储就是主键数据,而二级索引是非聚簇的,其叶子节点存储的是主键的键值;
在MyISAM中,主键索引与二级索引没什么区别,都是采用非聚簇,都是存储的数据行对应的地址。

2、示例

下面我们通过一个具体的示例进行演示聚集索引和二级索引

pl_ranking(编程语言排行榜表)

该表包含3个字段,如下:
id:主键
plname:编程语言名称
ranking:排名

id: 设置主键
plname: 普通索引

聚簇索引(主键索引)

从图中我们可以看到,索引数据和存储数据都是在一颗树上,存在一起的。通过定位索引就直接可以查找到数据。

这棵树是根据主键进行创建的。
如果查找id=16的编程语言,
select id, plname, ranking from pl_ranking where id=16;
则只需要读取3个磁盘块,就可以获取到数据。

二级索引(辅助索引)

从上图中我们发现,该B*tree根据plname列进行构建的,只存储索引数据,plname 和 id 的映射。

比如查找 编程语言为“Java”的数据。
select id, plname, ranking from pl_ranking where plname='Java';
首先通过二级索引树中找到 Java 对应的主键id 为 “16”(读取2个磁盘块)。
然后在去主键索引中查找id为“16” 的数据。(读取3个磁盘块)

3、结论

select id, plname, ranking from pl_ranking where id=16;
根据主键查找只需要查找3个磁盘块
select id, plname, ranking from pl_ranking where plname='Java';
根据编程语言名称查询需要读取5个磁盘块

结论一

通过上面的主键索引和非主键索引的例子我们可以得出:
主键索引(聚餐索引)查询效率比非主键索引查询效率更高。如果能使用主键查找的,就尽量使用主键索引进行查找。

结论二

从上面图中我们还可以分析得出以下结论:
主键定义的长度越小,二级索引的大小就越小,这样每个磁盘块存储的索引数据越多,查询效率就越高。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值