一. 引言mysql
Mysql 咱们日常用的不少,了解的不少,今天别的不说,直接说mysql的底层是什么,说到底层,就想到数据结构,那么,mysql的数据结构是什么呢? 是B + tree 。那么数据库中的索引是什么呢?sql
二. 索引是什么?数据库
数据库的目的是为了存储数据,那么索引的概念是什么呢? 最合理的解释,也是官方的解释就是:索引是帮助MySQL高效获取数据的数据结构。关键就是这个数据结构,什么目录的解释都是不合理的。数据结构
接下来咱们去看看索引究竟是如何高效获取数据的性能
先建一张student表简单的存放数据网站
id name spa
1 tom操作系统
2 jerryblog
3 jack索引
回到好久以前,你们先设想一下,若是以前没有mysql这种RDBMS(关系数据库管理系统)时,这些表存放在哪里呢?确定是存放在文件之中。
那么,执行一个简单的查询,如 select * from student where id = 1;
若是要执行逐条筛选的话会特别慢,好比要找到 id =100的,就要筛选100条数据,显然是不合理的,那么索引到底是如何高效获取数据的。
文件系统
首先,咱们先看一下咱们电脑中的文件系统,数据库数据是如何保存在文件中的
文件系统重要包括柱面 、 磁道和扇区,这是一种比较原始的存储方式
如图所示,若是每次查询都要从头转到尾的检索,效率性能都会很低,那么若是咱们将id 与这条数据在扇区的位置记录(address)的对应记录起来的话,每次能够直接找到数据的位置,那么速率则会大大加快,如同咱们看书时的目录同样,不须要讲前面的全部内容都过一遍。以下图所示:
到如今为止,咱们已经对索引的概念和实现方式有了基本的认识 ,如今咱们要谈论两个概念,通常存在于操做系统中,一个是时间局部性原理,一个是空间局部性原理。
渐进复杂度是递增的!!!
二叉树是线性增长的,并且每一个节点只能放一个数据,每查询一个数据,都会从头至尾执行一次,若是查询一次算一个IO的话,查询第1万条数据就要执行1万次IO,显然是不合理的。
红黑树:
渐进复杂度是递增的!!!
虽然高度减小了,可是高度仍是不可控的,IO执行次数仍是过多
B + tree
→
→
→
在这里咱们发现b+ tree的高度竟然是不变的,你们看这些图,若是想查某一id 的值,只须要查两次,好比最后一张图,查id为1 的: 0003 -> 0002 ->0001 ,其他的也都是查两次,这样咱们能够获得结论:
在B + Tree中,渐进复杂度是恒定不变的!!!
在B + Tree中,渐进复杂度是恒定不变的!!!
在B + Tree中,渐进复杂度是恒定不变的!!!
重要的事说三遍