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
最近更新
- 深拷贝和浅拷贝的区别(重点)
- 【Vue】走进Vue框架世界
- 【云服务器】项目部署—搭建网站—vue电商后台管理系统
- 【React介绍】 一文带你深入React
- 【React】React组件实例的三大属性之state,props,refs(你学废了吗)
- 【脚手架VueCLI】从零开始,创建一个VUE项目
- 【React】深入理解React组件生命周期----图文详解(含代码)
- 【React】DOM的Diffing算法是什么?以及DOM中key的作用----经典面试题
- 【React】1_使用React脚手架创建项目步骤--------详解(含项目结构说明)
- 【React】2_如何使用react脚手架写一个简单的页面?