您当前的位置: 首页 > 

星夜孤帆

暂无认证

  • 2浏览

    0关注

    626博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

聚簇索引和非聚簇索引

星夜孤帆 发布时间:2021-04-24 12:33:49 ,浏览量:2

一、MyISAM存储引擎索引实现 1.1 存储位置

1.2 MyISAM索引结构

MyISAM索引文件和数据文件是分离的(非聚集)

MyISAM引擎,叶子节点的data存的是索引所在行的磁盘空间地址。

MyISAM引擎,它的主键索引,跟数据是分开存储的,它存储的是数据对应的磁盘空间地址,跟数据没有放在一起,这种就叫做非聚集索引,也叫非聚簇索引。

1.3、MyISAM索引查找过程

假如有一个sql select * from table where Col1 = 30;

mysql先判断Col1是不是索引,如果是,在这个树上进行判断,定位到叶子节点30,然后,取出磁盘空间地址。

拿出来之后,到MYD文件中,快速的定位到磁盘空间地址,把这行数据拿出来。

二、InnoDb存储引擎索引实现 2.1 存储位置

对于MySQL的InnoDB存储引擎,它有两个文件,frm存储表结构,Ibd文件既存储索引,又存储数据。

2.2 InnoDB索引结构

表数据文件本身就是按B+Tree组织的一个索引结构文件

聚集索引-叶子节点包含了完整的数据记录

非叶子节点不存储data,只存储索引(冗余),可以放更多的索引

叶子节点包含所有索引字段

叶子节点用指针连接,提高范围查找性能。

为什么非主键索引结构叶子节点存储的是主键值?(一致性和节省存储空间)

与MyISAM不同,InnoDB叶子节点,存的是列数据,不再是索引所在行的磁盘空间地址。

这里就引出了聚集索引:

聚集索引,也就是聚簇索引,叶子节点包含了完整的数据记录,也就是说,你的索引,包括你的索引所在行的其他数据,都是放在一起的。这就是聚集索引。

InnoDB的主键索引,它就是聚集索引。

2.3 问题

为什么建议InnoDB表必须建主键,并且推荐使用整型 自增主键?

InnoDB底层要靠主键,来组织数据表数据,通俗点,就是要靠主键,来维护这个B+树。

但是,当我们对一张表不建主键时,发现也没有报错。其实,是Mysql底层为我们做了这件事。

它会看我们的每一列是否有唯一的这些数据列,如果有,就用这一列来组织树结构。

假如,连这个唯一的数据列也没有,那么,它会建一个唯一的隐藏列row_id,来维护B+树。

Mysql本身资源就很紧张了,所以,这些我们能做的一定要尽量做,尽量建立主键,

为什么要保证是整型且自增呢?

因为,mysql插入以及维护的时候,是有序的。

在查找数据的时候,会牵扯到很多比较,整型比大小,相比于uuid之类的字符串比大小要快的多。另外,整型相比于uuid类似的字符串,会更加节省空间。

假如,不是自增插入,由于B+树要维护索引的有序性,如果插入到之前页的数据,但是这些页16KB已经满了,就会涉及到B+树的分裂,影响性能。

如果,都是用自增的,每次都是往现有数据的后面插入数据。

B+Tree为什么可以提高范围查询性能?

首先,Mysql是一个排好序的数据结构,叶子节点都有一个双向指针进行连接。

假如,我们要查找col>20这些数据,我们可以先查col=20对应叶子节点的位置,定位到以后,由于都是排好序的,只需要依次往后遍历即可查出所有。

对于col

关注
打赏
1636984416
查看更多评论
立即登录/注册

微信扫码登录

0.0442s