索引的作用是提升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链接而成。
2、深入理解一个page
一个page中保存了多条记录,但是在检索的时候,每进入一个page查询,依然需要逐个遍历,这样看来,检索效率并没有提升多少。
实际上,为了提升单个page的检索效率,每个page除了保存数据库记录外,还会有对应的索引目录。(类似于书本的目录),这样的话我们在查找的时候,其实是根据目录来查询,这样可以减少检索次数,提升检索效率。
假设我们要查询索引为 4 的记录,此时Mysql在查询第一个page中的目录时,
- 查询目录1:指向的是索引为1的记录,下一条指向的是索引为3 的记录,要查找的内容不在此范围,直接跳过
- 查询目录2:指向的是索引为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。
无需每一条都去遍历,只需要自上而下,按层遍历,也不需要加载太多无效数据,每次加载数据都会获取到我们需要的数据