只整理了一小部分,有错误还请各位大哥指正!
0.B树和B+树的区别(重点)
B+树是应数据库所需而出现的一种B树的变形。
B+树结点的子树个数=关键字个数。而B树子树个数-1=关键字个数。
B+树仅在叶子节点存储索引对应信息(而B树则每个节点中都存放了索引对应信息),所以一个磁盘可以存下更多的索引元素,大大减少磁盘访问操作。这也是为什么大多数数据库选择B+树的主要原因。
B+树叶子节点间有双向的指针,支持顺序查找、范围查找。
1.当数据量很大时如何对查询做一些优化
在数据库中创建索引,索引是帮助数据库高效获取数据的排好序的数据结构,相当于设置了一个目录。
2.常见的MySQL主要的两种索引结构
Hash索引和B+ 树索引
3.mysql底层为什么采用B+树而不是其他
对于Hash表而言:B+树叶子节点有指针相连,支持范围查找,而Hash不支持(致命缺点)。不支持多列联合索引的最左匹配规则。并且Hash存在哈希碰撞的情况。
对于红黑树而言:B+树的树的高度更矮,可以减少磁盘访问操作。
对于B树而言:B+树仅在叶子节点存储索引对应信息,所以一个磁盘可以存下更多的索引元素,大大减少磁盘访问操作。并且B+树支持范围查找。
4.InnoDB存储引擎(默认B+树索引)
InnoDB基于磁盘存储,即数据都是存储在磁盘上的,由于 CPU 与磁盘的速度差很大, 所以使用缓冲池技术来提高数据库的整体性能。
5.B+ 树的叶子节点都可以存哪些东西?两者有什么区别吗?
可能存储的是整行数据,也有可能是主键的值。
在 InnoDB 里,B+ 树的叶子节点存储了整行数据的是聚集索引。而存储了主键的值的是非聚集索引,此时还需回表查询对应数据。
6.最左前缀原则
即最左优先,在检索数据时从联合索引的最左边开始匹配,并且不能跳过索引中的列。
查询语句必须包含所有列, 或者第一列,前两列, 前三列, 以此类推...只是不能跳过索引中的列,如果跳过则会使B+树的查找退化成顺序查找。
(因为只有在前一个字段相等情况下该字段才有序,所以跳过前一个字段直接查找相当于需要顺序查找。)
7.事务
是用户定义的一个数据库操作序列,这些操作要么全做,要么全不做,是一个不可分割的工作单位。(原子性、一致性、隔离性、永久性)
8. 范式
可以理解为一张数据表的表结构所满足的某种设计标准的级别。
1NF:符合一范式的表中的属性都不可再分。(问题:数据冗余,增删改异常)
2NF:看数据表中是否存在非主属性对码的部分函数依赖。不存在则属于第二范式。
码:可以确定一条数据的属性的集合。
非主属性:除了码的其他属性。
部分函数依赖:非主属性可以由码中的一部分决定。而不是需要整个码才能决定。(相对于完全函数依赖)如姓名这个非主属性可以由码的一部分(学号)决定,所以是部分函数依赖。
3NF:看数据表中是否存在非主属性对码的传递函数依赖。不存在则属于第三范式。
传递函数依赖:A依赖B,B依赖C,那么A依赖C。
学习地址:https://www.bilibili.com/video/BV14Z4y1d7Zr?p=2 (前50min是干货,后面都是广告。。)