mysql主键索引原理

一,索引作用

索引的作用是提升Mysql的检索速度

如果没有索引:若我们要在几百万条记录中找出一个名为“张三”的人,这个时候我们只能逐条遍历记录,直至找到这个人;
如果有索引:假设名为“张三”的人所在记录的索引为 999,我们只需要像在目录中查页码一样,很快就可以知道第 999 页大概在哪一个章节。
索引虽然是以插入、更新、删除的速度为代价的,这些写操作增加了大量的IO,但是这些代价带来的就是海量数据的检索速度的提升。

二,原理

1、Mysql 和 磁盘交互的基本单位


假设 Mysql 查询一条记录的时候,不可能仅仅加载一条记录到内存,如果要频繁查询,就会增加和磁盘的IO次数,这样既费时又费力。

为了减少和磁盘IO的次数,Mysql 每次查询会加载 16 KB 到内存,所以 Mysql 和磁盘交互的基本单元是 16 KB。站在Mysql的角度,一个基本单元就是一个 page,每个page中都保存了多条记录,而 Mysql 的一个表格可以由多个page链接而成。

2、深入理解一个page


一个page中保存了多条记录,但是在检索的时候,每进入一个page查询,依然需要逐个遍历,这样看来,检索效率并没有提升多少。

实际上,为了提升单个page的检索效率,每个page除了保存数据库记录外,还会有对应的索引目录。(类似于书本的目录),这样的话我们在查找的时候,其实是根据目录来查询,这样可以减少检索次数,提升检索效率。

 

假设我们要查询索引为 4 的记录,此时Mysql在查询第一个page中的目录时,

查询目录1:指向的是索引为1的记录,下一条指向的是索引为3 的记录,要查找的内容不在此范围,直接跳过(1-3)
查询目录2:指向的是索引为3的记录,下一条指向的是索引为5的记录,要查找的内容在这个范围内,于是进入该目录指向的范围逐个遍历。(3-5)

3、理解多个page

假设现在有 1000 个page,我们要找某一条记录,最坏的情况下我们要遍历1000个page,我们沿用上面单个page的思路,每100个page做一个目录页,目录中每一条保存的是所指向的page页的最小索引值

假设我们要查询索引值为4的记录:

  • 在第一层目录中查找:第一条符合,第二条不符合,所以索引值为4的记录在第一条记录指向的page中
  • 在第二层目录中查找:可以参考上述单个page的检索过程

 

3、Mysql 主键索引机制

(1) 整体架构

目录页的本质也是页,最底层的页存的是用户数据,而目录页中存的是下一层page的地址。实际上,如果目录页比较多,依然可以采用同样的思路,继续增加一层目录页。最终可以了解到Mysql索引机制使用的数据结构就是 B+ 树。

 

(2) 增删查改的过程


每次检索的时候,一层一层向下查找,到了最后一层再进入到page页中遍历记录。找到以后,再把记录所在的page一起加载到内存中。(这也就解释了为什么Mysql和磁盘交互的基本单位是一个page)

每次插入或者删除的时候,都是先在内存中操作对应的page页,更新时直接替换原本的page。

无需每一条都去遍历,只需要自上而下,按层遍历,也不需要加载太多无效数据,每次加载数据都会获取到我们需要的数据
 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Nathaniel333

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

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

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

打赏作者

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

抵扣说明:

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

余额充值