Mysql 索引(一)—— 主键索引的底层原理

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

  • 如果没有索引:若我们要在几百万条记录中找出一个名为“张三”的人,这个时候我们只能逐条遍历记录,直至找到这个人;
  • 如果有索引:假设名为“张三”的人所在记录的索引为 999,我们只需要像在目录中查页码一样,很快就可以知道第 999 页大概在哪一个章节。

索引虽然是以插入、更新、删除的速度为代价的,这些写操作增加了大量的IO,但是这些代价带来的就是海量数据的检索速度的提升。


         目录

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

2、深入理解一个page

3、理解多个page

3、Mysql 主键索引机制

(1) 整体架构

(2) 增删查改的过程


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

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

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

Mysql 索引(一)—— 主键索引的底层原理_第1张图片

2、深入理解一个page

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

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

Mysql 索引(一)—— 主键索引的底层原理_第2张图片

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

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

3、理解多个page

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

Mysql 索引(一)—— 主键索引的底层原理_第3张图片

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

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

3、Mysql 主键索引机制

(1) 整体架构

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

Mysql 索引(一)—— 主键索引的底层原理_第4张图片

(2) 增删查改的过程

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

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

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

你可能感兴趣的:(Mysql,/,Sqlite,数据库,mysql,数据库)