Mysql
1、索引,k-v对,k是索引字段的字段值,v-这条数据在磁盘上的位置指针
2、实际是B-Tree
3、
使用二叉树、红黑树、B-Tree等树状结构存储索引,是为了快速查找,当极端情况,比如数据是递增的,二叉树就会出现严重的倾斜,虽然红黑树可以自平衡,但是当数据量足够大 时,树的高度还是很高,达不到我们创建索引是为了快速查找的目的。
树的每个节点16k,可以使用sql查看<SHOW GLOBAL STATUS LIKE 'Innodb_page_size'>
我们需要找到一种高度可控的树状数据结构,即在大数据量下,树的高度尽可能的最小,这样就可以最快速度查找到,
每个节点16k,我们可以在每个节点存储多个k-v,这样就可以降低树的高度;
B-Tree,每个节点就是存储了多个k-v,且叶子节点之间没有指针
B+Tree,是B-Tree的变种,它把非叶子节点只存储索引,不存储值,叶子节点存储了所有的k-v,非叶子节点对索引做了冗余,使得每个非叶子节点的存储量更大,使得树的高度更低,叶子节点之间有指针,使得查找速度更快,尤其对范围查询时比B-Tree更快
4、
5、
6、MyISAM引擎和InnoDB引擎都是使用的B+Tree的索引结构文件,区别在于:
MyISAM的B+Tree的叶子节点记录的是索引字段的值的这条数据在磁盘文件中的指针地址
InnoDB的B+Tree的叶子节点记录的是索引字段的值的这条数据。
7、聚集索引和非聚集索引:
索引和数据分开存储的,比如MyISAM就是非聚集索引;
索引和数据一起存储的,比如InnoDB就是聚集索引。
8、为什么InnoDB表必须有主键,并且推荐使用整型的自增主键?
①、InnoDB设计的就是必须要有主键,如果我们创建表时没有设定主键,那么InnoDB会从所有字段中选取一个可以创建唯一索引(不会出现null值的字段)的字段作为主键来维护,如果没有这样的字段,那么InnoDB会自己给我们创建一个字段作为主键在后台维护,我们是看不到的。
②、整型:每次查找索引时,要对索引值进行比较,只有整型数据的大小比较时最快的,反例就是常用的UUID,比较速度肯定没有整型数据快
③、自增:
a、B+Tree的叶子节点之间有指针,当范围查询时where id > 6,如果索引是整型递增的,则可以很容易定位到6,根据6所在叶子节点依次根据指针方向获取数据即可,非常快,对比B-Tree,叶子节点没有指针,Hash类型的索引只适用于精确查找,因为只需要对查找值做一次hash计算即可快速找到数据,但是无法适用于范围查找。
b、降低树数据维护及自平衡的资源开销,通过下面的工具,insert非递增的数据,当数据量很小的时候,树就要开始花费较大的开销来维护
9、联合索引
9.1、联合索引的底层数据结构