1、B-Tree
- 相比较红黑树来说,B-Tree很大程度上提升了查询效率(树的高度为3的情况下,Mysql单表可以存放千万级数据,理论上来说,如果做等值查询,最多只需要3次磁盘的IO就会就会得到数据),上图是B-Tree的数据结构,可以看到每一个key对应的一个data,如果表内数据比较庞大(或是字段较多的情况),这样就造成了树十分庞大,单次IO加载索引文件的时候会非常的慢,于此同时各个节点之间也没有关系(如指针等),对此,引入了B+Tee
2、B+Tree
- 叶子节点不存储指针;
- 顺序访问指针,提高区间访问的性能;
- 非叶子节点不存储data,只储存key,可以增大度(Degree);
- 对比B-Tree来说,B+Tree可以很好的支持范围查询,降低了单次IO的成本
- MYISAM的聚簇索引和非聚簇索引的结构都是一样的,存放索引结构和数据内容的文件是分开存放的
-
聚簇索引下存放的是真实的数据,非聚簇索引下存放的是聚簇索引的id(一致性:每次对数据进行CRUD的操作,对应的索引结构也要做出对应的调整,减少维护的成本;节省存储空间:服务器的内存空间是非常宝贵的,能节省就节省),也就是说大部分情况下,都是要进行回表查询的操作,这也就是主键索引为什么比非主键索引块的根本原因
-
为了满足MySQL的索引数据结构B+树的特性,必须要有索引作为主键,可以有效提高查询效率,因此InnoDB必须要有主键。如果不手动指定主键,InnoDB会从插入的数据中找出不重复的一列作为主键索引,如果没找到不重复的一列,这时候InnoDB会选择内置的ROWID作为主键,写入顺序和ROWID增长顺序一致;
-
索引的数据类型是整型,一方面整型占有的磁盘空间或内存空间相比字符串更少,另一方面整型比较比字符串比较更快速,字符串比较是先转换为ASCII码,然后再比较的。
-
B+树本质是多路多叉树,如果主键索引不是自增的,那么后续插入的索引就会引起B+树的其他节点的分裂和重新平衡,影响数据插入的效率,如果是自增主键,只用在尾节点做增加就可以。
###3、Hash
-
通过Hash算法得到数组的下标值,进行存放,如果Hash冲突,使用链表来解决冲突(类似JDK1.7以前的HashMap,也可以使用寻址的方式解决冲突,维护成本比较高)