一:Mysql索引:

索引是对数据库表中一列或多列的值进行排序的一种结构,使用索引可快速访问数据库表中的特定信息。如果想按特定职员的姓来查找他或她,则与在表中搜索所有的行相比,索引有助于更快地获取信息。
    索引的一个主要目的就是加快检索表中数据,亦即能协助信息搜索者尽快的找到符合限制条件的记录ID的辅助数据结构。
    索引是对数据库表中一个或多个列(例如,employee 表的姓名 (name) 列)的值进行排序的结构。
    例如这样一个查询:select * from table1 where id=10000。如果没有索引,必须遍历整个表,直到ID等于10000的这一行被找到为止;有了索引之后(必须是在ID这一列上建立的索引),即可在索引中查找。由于索引是经过某种算法优化过的,因而查找次数要少的多。可见,索引是用来定位的。
     从数据搜索实现的角度来看,索引也是另外一类文件/记录,它包含着可以指示出相关数据记录的各种记录。其中,每一索引都有一个相对应的搜索码,字符段的任意一个子集都能够形成一个搜索码。这样,索引就相当于所有数据目录项的一个集合,它能为既定的搜索码值的所有数据目录项提供定位所需的各种有效支持。
     说白了:索引是帮助MySql高效获取数据的排好序的数据结构

二:索引的数据结构底层为什么不用二叉树

比如说现在有这样一张表,以col1为索引会出现什么情况:

数据库底层索引 数据库的索引结构_索引


二叉树的结构就是这样:

数据库底层索引 数据库的索引结构_索引_02


*比如sql语句是这样的:select from t where t.Col1=6;
这样的话就会查找6次和全表扫面没多大的区别。
所以当以某个递增字段为索引的话查询是非常耗费时间的,在某些场景二叉树是不合适的。

三:索引的数据结构底层为什么不用红黑树

1:比如现在有这样一个红黑树结构

数据库底层索引 数据库的索引结构_索引_03


从图中可以看到红黑树比二叉树够优秀一些。
如果现在有这样一个场景:如果有好几百万的数据,树高为20,如果现在要查找的数据在叶子节点的,最快我们需要查找20次,相当于我们要进行20次的I/O操作
也是比较耗费时间,耗费性能的,所以没有选择红黑树

四:索引的数据结构底层为什么最终选择了B+Tree

1:首先看下B+Tree的结构:

数据库底层索引 数据库的索引结构_数据库底层索引_04


B+Tree特点:非叶子节点不存储data,只存储索引(冗余),可以放更多的索引
叶子节点包含所有索引字段
叶子节点用指针连接,提高区间访问的性能
2:B+Tree结构解析

数据库底层索引 数据库的索引结构_数据结构_05


3:B+Tree查询过程:

比如sql:select *from t where t.col1=30的话(比较上图来看)

数据库底层索引 数据库的索引结构_索引_06


4:索引底层结构大小(也是为什么查询效率高的原因)

数据库底层索引 数据库的索引结构_数据库底层索引_07