1. 为什么Mysql底层选择B+树作为数据结构?
1. 二叉树:容易转换为链表。
2. 红黑树:数据层数太高。(二叉平衡树)
3. B+ Tree: 多叉平衡树。 索引节点是从左向右升序排列。
1.
4. B- Tree
1. 叶节点具有相同的深度,叶节点的指针为空。
2. 所有索引元素不重复。
3. 节点中的数据索引从左至右递增排列。
2. Mysql索引节点
1. 一个索引节点分配16KB大小。
2. 索引数据和区间索引地址(两个索引节点之间的数据所在的内存地址)构成。
3. MySQL根节点索引是常驻在内存中。
4. 每一次IO操作,都会获取一个索引节点。
3. 存储引擎
1. 存储引擎是针对数据表,不是针对数据库的一个库中可以存储不同存储引擎的数据表。
4. myisam引擎内容
-
存储数据相关文件:
- tableName.frm:存储table的表结构。
- tableName.MYD:存储table中的数据。
- tableName.MYI:存储table的索引。
-
查询的过程
- 没有索引:直接进行全表扫描。
- 存在索引:
- 查找索引(MYI文件)。
- 根据索引中存储的数据内存地址,在(MYD文件)查找数据。
- 加载到内存中。
-
索引(非聚集索引)
- 索引文件和数据文件是分离的。
- 索引的叶子节点,存储的是数据所在的内存地址。
5. InnoDB引擎内容
-
存储数据相关文件:
- tableName.frm: 存储table的表结构。
- tableName.ibd:存储table的索引以及数据。
-
面试题
- 为什么InnoDB建议,必须建立主键,并且推荐使用整型的自增主键?
- InnoDB底层会根据主键,组建B+Tree的数据。
- 没有建立主键时,InnoDB会在底层寻找一个不重复数据的列,作为主键索引,构建B+Tree的数据组成。若找不到合适列,Mysql会新建一个隐藏列,作为主键索引,构建B+Tree的数据组成。
- 推荐使用整型;是因为整型占用的存储空间小,且容易比较大小(因为B+Tree是保证索引节点,是从左到右,依次递增)。
- 使用自增;若主键时随意大小,那么会导致,叶子节点会进行分裂,且B+Tree会进行自平衡,降低效率。
- BTree和B+Tree的区别?
- Btree叶子节点没有关联;
- B+Tree叶子节点之后是使用双向链表结构,互相关联在一起的。
- 为什么InnoDB建议,必须建立主键,并且推荐使用整型的自增主键?
-
Hash索引
- 定义:根据查找语句的字段,进行hash运算,得到磁盘对应的行存储地址 。
- 优势:对于=这样的可以快速查询。
- 劣势:对于> or < 等等这种区域操作,则无法快速查询数据。
-
索引(聚集索引):
- 索引文件和数据文件是在一起的。
- 索引的叶子节点,存储的是对应索引的行完整数据。
- 聚集索引定义:就是索引的叶子节点,存储的就是完整数据行。
- 叶子节点是数据结构是双向指针;方便进行范围的查找。
6. 索引优化
- 联合索引的底层数据结构是怎么样的?
- 索引节点中,就会存储多个字段的数据;然后数据节点中存储其余的字段数据。
- 比较大小:会一个一个字段进行比较,若第一个字段就能比较出大小,则不会进行后面字段的比较;因此,当我们使用索引时,若查询的字段顺序,不符合索引字段的顺序,则无法使用索引。 eg: key(a, b, c); where b == 1 and a == 2 and c==1, 依然会被Mysql底层,优化使用到索引。除非,where中不含a开头,就会无法使用索引。