mysql的存储引擎 主要分为两种 mysim和innodb,mysim是只有表级锁,且没有事务,innodb有行级锁,并且有事务
mysql的索引底层存储为B+树,为什么没有用2叉树(因为在某种极端的情况下,2叉树会演变成列表,会降低查询效率),为什么没有用红黑树(因为红黑树的高度不可控),为什么没有用B树。
B树的特点
(1)排序方式:所有节点关键字是按递增次序排列,并遵循左小右大原则;
(2)子节点数:非叶节点的子节点数>1,且<=M ,且M>=2,空树除外(注:M阶代表一个树节点最多有多少个查找路径,M=M路,当M=2则是2叉树,M=3则是3叉);
(3)关键字数:枝节点的关键字数量大于等于ceil(m/2)-1个且小于等于M-1个(注:ceil()是个朝正无穷方向取整的函数 如ceil(1.1)结果为2);
(4)所有叶子节点均在同一层、叶子节点除了包含了关键字和关键字记录的指针外也有指向其子节点的指针只不过其指针地址都为null对应下图最后一层节点的空格子;
B+树的特定
(1)B+跟B树不同B+树的非叶子节点不保存关键字记录的指针,只进行数据索引,这样使得B+树每个非叶子节点所能保存的关键字大大增加;
(2)B+树叶子节点保存了父节点的所有关键字记录的指针,所有数据地址必须要到叶子节点才能获取到。所以每次数据查询的次数都一样;
(3)B+树叶子节点的关键字从小到大有序排列,左边结尾数据都会保存右边节点开始数据的指针。
(4)非叶子节点的子节点数=关键字数(来源百度百科)(根据各种资料 这里有两种算法的实现方式,另一种为非叶节点的关键字数=子节点数-1(来源维基百科),虽然他们数据排列结构不一样,但其原理还是一样的Mysql 的B+树是用第一种方式实现);
B树和B+树的区别,B树的每个节点,除过有索引信息之外还携带着行信息data,并且没有冗余的索引,
B+树,每个非叶子节点都只含有索引信息,并且子节点和父节点有冗余的索引信息。B+树的所有数据信息都存储在叶子节点,并且相邻的叶子节点之间有指针指向。所有的非叶子节点只存储索引而不存储数据data的好处是,mysql默认规定,每个节点的大小是16KB,非叶子节点只存储索引而不存储data,可以使每个非叶子节点存储更多的数据,这样同样的高度,就会存储尽可能多的信息。叶子节点之间有指针指向,可以更好的支持范围查找。
在mysql中如果一个表中没有建立主键,则mysql会比对每列数据找出列中数据不相等的列作为聚簇索引,如果找不到会建立隐藏列入rowId作为聚簇索引。所以还是建议每张表都要建立主键。并且使用自增主键,是因为自增主键在比较起来比较快,而且每次都是递增插入的,不会改变B+树的结构,不需要拆分节点,还保存B+树的特性