Linux_MySQL(核心) 索引(MySQL与存储,磁盘构造,MySQL与磁盘的基本交互,索引的理解与构成B+树,B+树与页表,B树与B+树,聚簇索引与非聚簇索引,索引的建立)

1.索引

索引的目的:提高数据库查询的速度。
索引实际上是将数据做了一些特殊的规制来提高查找效率。
如果没有索引,大量数据查询时效率太低,耗时太长

但是由于将数据以特定的数据结构保存,所以插入的速率会下降。

所以使用索引需要看具体的业务。

常见的索引:

  • 主键索引(primary key)
  • 唯一索引(unique)
  • 普通索引(index)
  • 全文索引(fulltext)–解决中子文索引问题。(了解)

2.MySQL与存储

MySQL 给用户提供存储服务,而存储的都是数据,数据在磁盘这个外设当中。磁盘是计算机中的一个机械设备,相比于计算机其他电子元件,磁盘效率是比较低的,在加上IO本身的特征,可以知道,如何提高效率,是 MySQL的核心问题。

磁盘

在这里插入图片描述

  • 扇区
    数据库文件,本质其实就是保存在磁盘的盘片当中。也就是上面的一个个小格子中,就是我们经常所说的扇区。当然,数据库文件很大,也很多,一定需要占据多个扇区。

  • 定位扇区
    在这里插入图片描述

柱面(磁道): 多盘磁盘,每盘都是双面,大小完全相等。

同半径的磁道,整体上便构成了一个柱面,每个盘面都有一个磁头,那么磁头和盘面的对应关系便是1对1的

所以,我们只需要知道,磁头(Heads)、柱面(Cylinder)(等价于磁道)、扇区(Sector)对应的编号。即可在磁盘上定位所要访问的扇区。

综上:定位扇区的过程:(CHS)
1.定位盘面
2.确定数据在那个柱面(磁道)
3.在磁道中找到对应的扇区

这种磁盘数据定位方式叫做 CHS 。
不过实际系统软件使用的并不是 CHS (但是硬件是),而是 LBA ,一种线性地址,可以想象成虚拟地址与物理地址。系统将 LBA 地址最后会转化成为 CHS ,交给磁盘去进行数据读取。

  1. 系统读取磁盘,是以块为单位的,基本单位是 4KB 。因为使用512字节(一个扇区的大小)与磁盘交互,操作系统和硬件耦合性提高。当硬件发生改变,影响了操作系统。其次单次交互512字节太小了,操作系统会频繁的访问磁盘。

  2. 操作系统以4KB与磁盘交互,一方面可以提高操作系统查找效率,其次是实现操作系统和硬件的解耦。

  3. 文件系统,就是在磁盘的基本结构下建立的,文件系统读取基本单位,就不是扇区,而是数据块。

  • 磁盘随机访问(Random Access)与连续访问(Sequential Access)

随机访问:本次IO所给出的扇区地址和上次IO给出扇区地址不连续,这样的话磁头在两次IO操作之间需要作比较大的移动动作才能重新开始读/写数据。

连续访问:如果当次IO给出的扇区地址与上次IO结束的扇区地址是连续的,那磁头就能很快的开始这次IO操作,这样的多个IO操作称为连续访问。

因此尽管相邻的两次IO操作在同一时刻发出,但如果它们的请求的扇区地址相差很大的话也只能称为随机访问,而非连续访问。磁盘是通过机械运动进行寻址的,随机访问不需要过多的定位,故效率比较高。

MySQL与磁盘的基本交互

MySQL本质上也可以理解为一个文件系统。

操作系统与硬件交互是4KB
MySQL 进行IO的基本单位是 16KB(InnoDB存储引擎)

在这里插入图片描述
MySQL 和磁盘进行数据交互的基本单位是 16KB 。这个基本数据单元,在 MySQL 这里叫做page(注意和系统的page区分)

总结:

  1. MySQL 中的数据文件,是以page为单位保存在磁盘当中的。
  2. MySQL 的 CURD 操作,都需要通过计算,找到对应的插入位置,或者找到对应要修改或者查询的数据。
  3. 而只要涉及计算,就需要CPU参与,而为了便于CPU参与,一定要能够先将数据移动到内存当中。MySQL在启动时就已经申请了大量的空间,作为数据的缓冲区(buff_pool)
    在这里插入图片描述

MySQL对表的增删查改都是在buff_pool中实现的,如果buff_pool中没有需要的数据,则MySQL会先将数据从内存拿到buff_pool,在buff_pool修改后刷新到磁盘上。

根据上面的分析,MySQL所有的操作都在内存中进行,而不是磁盘

3.索引的理解(B+树索引结构)

首先在MySQL中,要管理很多数据表文件。
而要管理好这些文件,一定有大量page换入换出内存,MySQL需要对这些page进行管理,就需要 先描述,在组织,

page在MySQL中以双链表的形式存储。
Page大小固定为16KB。

下图是一个Page的部分结构
在这里插入图片描述

首先如果数据有序,查找的效率会提高很多。如果直接线性遍历,效率比较低,同时如果数据有序,MySQL在设计Page中可以设计类似“目录”的结构提高搜索效率。
在这里插入图片描述
使用空间换取时间。


进一步,如果Page很多时,在定位Page时就会产生效率问题。MySQL为了解决这个问题,解决方法类似,给Page带上"目录"。

MySQL在管理Page时有写Page不保存用户数据,只用来保存Page与Page之间的关系。加目录的方式也是区间性的
在这里插入图片描述
当数据继续增多时,对目录再添加一层目录
在这里插入图片描述
这种结构就成为B+树,上文B+树的组织方式就称为索引结构。

B+树是一颗多叉树,叶子节点个数与每个目录区间个数有关

MySQL B+树特点:

  1. 数据全部保存在叶子节点的形式,叶子节点通过双链表的形式组织起来
  2. MySQL默认会构建主键索引,MySQL默认会把数据以B+树的结构保存到buff_pool里。
  3. 数据的增删查改就是修改B+树的过程。Page中有标记位标记是否需要修改,定期把标记的Page IO 16KB刷新到磁盘即可。
  4. 需要访问那些Page是MySQL才会将这个Page换入到内存中。整个B+树不会全部加载到内存里。
  5. MySQL 索引Page不带数据,因为这样16KB可以保存更多索引信息。降低了树的高度,IO次数减少,效率更高。
  6. 叶子节点采用双链表的形式,不仅方便了在叶子节点上插入数据,还方便了MySQL区间查找。
  7. MySQL是一个用户级别的文件系统,所有底层完成的数据读写,本质上也是通过读取文件完成的,Page是固定大小,使读写文件的难度降低。

B+树与页表

将B+树倒置过,可以发现,操作系统虚拟内存向物理内存映射时就是通过B+树的形式映射的(页表)

在这里插入图片描述

B树与B+树

这两棵树,最主要的区别是:

  1. B树节点,既有数据,又有Page指针,而B+,只有叶子节点有数据,其他目录页,只有键值和Page指针
  2. B+叶子节点,全部相连,而B没有

MySQL选择B+树不选择B树的原因

  1. 节点不存储data,这样一个节点就可以存储更多的key。可以使得树更矮,所以IO操作次数更少。
  2. 叶子节点相连,更便于进行范围查找

4.聚簇索引与非聚簇索引(MyISAM)

MyISAM 引擎同样使用B+树作为索引结果,叶节点的data域存放的是数据记录的地址而不是数据。下图为 MyISAM 表的主索引,Col1 为主键

在这里插入图片描述
MyISAM每次将选中地址的数据加载到内存上,MyISAM 这种用户数据与索引数据分离的索引方案,叫做非聚簇索引。

相较于 InnoDB 索引, InnoDB 是将索引和数据放在一起的,这种索引形式是聚簇索引

数据有没有放到索引里,放到索引里就是聚簇索引(InnoDB),反之就是非聚簇索引(MyISAM)

5.索引的建立

索引的建立是以列为单位的。

也可以建立按照其他列信息建立索引,一般这种索引叫做辅助(普通)索引。

  • 对于 MyISAM ,建立辅助(普通)索引和主键索引没有差别,无非就是主键不能重复,而非主键可重复。
  • InnoDB 的非主键索引中叶子节点并没有数据,而只有对应记录的key值。
    所以通过辅助(普通)索引,找到目标记录,需要两遍索引:首先检索辅助索引获得主键,然后用主键到主索引中检索获得记录。这种过程,就叫做回表查询。
    InnoDB采用这种方式,防止了用户创建大量的索引导致数据冗余。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

NUC_Dodamce

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值