MyISAM、InnoDB与联合索引


一、聚集索引与非聚集索引

聚集索引
聚集索引就是索引和数据存储在一块的如InnoDB

聚集索引有时候也叫聚簇索引

非聚集索引
非聚集索引就是索引和数据分开存储如MyISAM

二、MyISAM

采用MyISAM在磁盘中是怎样存储的呢?

MyISAM索引文件和数据文件是分开的(非聚集),存储引擎在磁盘中文件有三个,

一个是 .frm 文件(数据表定义),

一个是 .MYI(索引),

一个是 .MYD(实际数据,存储的是一整行的数据,包括索引值)。

MY文件是B+Tree为底层组织的文件。

比如查找 49,那么再 .MYI 中找到 49对应的磁盘指针 0x49,根据 0x49 去 .MYD找到实际的数据内容 data。
在这里插入图片描述

三、InnoDB

InnoDB存储引擎是聚集索引的。它的表数据文件本身就是按 B+Tree 组织的一个索引文件。

不同于MyISAM存储引擎是,数据不分离。

如下图,找到49的索引之后,数据就在该节点,不必像MyISAM存储引擎那样,需要根据磁盘指针到另一个文件中取数据。性能比MyISAM高。
在这里插入图片描述

InnoDB必须要有主键,并且推荐使用整型自增主键

要有主键:mysql底层就是用B+Tree维护的,而B+Tree的结构就决定了必须有主键才能构建B+Tree树这个结构。每个表在磁盘上,是单独的一个文件。索引和数据都在其中,文件是按照主键索引组织的一个B+TREE结构。假如没有定义主键,MySQL会在挑选能唯一标识的字段作为索引;假如找不到,会生成一个默认的隐藏列作为主键列。

整型主键:假如使用类似 UUID 的字符串作为主键,那么在查找时,需要比较两个主键是否相同,这是一个相比整型比较 非常耗时的过程。需要一个字符,一个字符的比较,自然比较慢。

自增主键:自增的好处体现在,

后面的主键索引总是大于前面的主键索引,在做范围查询时,非常方便找到需要的数据。
在添加的过程中,因为是自增的,每次添加都是在后面插入,树分裂的机会小;而UUID大小不确定,分裂机会大,性能损耗大。

7.2.3 为什么非主键索引结构叶子节点存储的是主键值?

非主键的 data存储的是 主键值的好处:

  1. 节省空间:指向主键的节点,不用再存储一份相同的数据;
  2. 数据一致性:如果修改索引15 的数据,那只要修改主键的 data,
  3. 而如果非主键的data也存一份的话,那得修改两份。

在这里插入图片描述

三、 联合索引

在这里插入图片描述
我们可以看到联合索引的key值可以为好几个那么他们是怎么实现递增的呢?

如何实现递增

例如key为(a,b,c)
先比较a大的在右边
在这里插入图片描述
如果a相同比较b
在这里插入图片描述
如果ab相同比较c
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值