1、索引结构
索引概念:是帮助mysql高效获取数据的排好序的数据结构
2、MySQL为什么用B+Tree
为什么不用二叉树,单边增长
为什么不用红黑树,树的高度不受控制
为什么不用B-Tree,为了节省空间
为什么不用Hash表,Hash不支持范围查询
B+Tree结构特点:
非叶子节点不储存Data,只储存索引(冗余),可以放更多的索引
叶子节点包含所有索引字段
叶子节点用指针链接,提高区间访问的性能
B+Tree结构的特点决定
因为mysql数据是存在磁盘上的,查询磁盘消耗性能的最大因素就是磁盘IO,为了能减少磁盘IO,就要
尽量少的操作就能完成查询,B+Tree怎么能满足这个条件呢,他不像二叉树,一个节点只有一个元素,
B+Tree默认一个节点16kb大小,可以存储多个索引元素,而且只有叶子节点才会存数据,非叶子节点
只存储索引和指向下一个元素的指针,这样就降低了索引树的高低,减少IO次数
可以预估一下,B+Tree 3层树高低大概能存多少元素,假设,主键索引用8个字节,指针6个字节,
一个页默认 16kb
第一层,可以储存 16kb/(8+6)b = 1170
第二层,一样 是 1170
第三层,包括Data,一般一条数据不会超过1kb,就是 16
三层一共是 1170*1170*16=21902400
3、B-Tree与B+Tree的区别
B+Tree只有叶子节点存放Data
B+Tree索引数据做了冗余,非叶子节点存了所有的索引数据
B+Tree非叶子节点之间有双向指针(B+Tree只有单项指针,mysql优化为双向),而B-Tree没有
4、Mysql主键为什么建议用整型的自增主键
1、如果表中没有主键,mysql会找到唯一索引列作为主键,如果也没有,会有一个隐藏列作为主键
2、因为mysql索引是排好序的,如果不是自增主键,mysql会发生页的分裂和重平衡
3、整型的原因是储存小,索引查询快
5、为什么非主键索引的叶子节点存储的不是Data,而是主键值
为了保证数据一致性和节省储存空间
6、为什么索引会有最左前缀原则
因为索引是排好序的结构,如果不遵循最左前缀原则,查询的数据会全表扫描才能查询到所需要的数据