20. Hash索引和B+树索引的区别?【重点】
hash索引:等值查询效率高,不能排序,不能进行范围查询;
B+树索引:数据有序,适合范围查询。
21. MySQL中三种锁的级别?【了解】
表级锁:开销小,加锁快;不会出现死锁;锁定粒度大,发生锁冲突的概率最高,并发度最低。
行级锁:开销大,加锁慢;会出现死锁;锁定粒度最小,发生锁冲突的概率最低,并发度也最高。
页面锁:开销和加锁时间界于表锁和行锁之间;会出现死锁;锁定粒度界于表锁和行锁之间,并发度一般。
22. B树和B+树的区别?【重点】
B树:
每个节点都存储key和data,所有节点组成这棵树。
叶节点包含的关键字和其他节点包含的关键字是不重复的。
B+树:
只有叶子节点存储数据;
有两个头指针:一个指向根节点,另一个指向关键字最小的叶节点;
中间节点不保存数据,能容纳更多节点元素;
叶子节点包含了这棵树的所有数据,所有的叶子结点使用链表相连,便于区间查找和遍历;
所有的中间节点起到索引作用。
23. 为什么说B+树比B树更适合实际应用中的文件索引和数据库索引?【了解】
B+树的磁盘读写代价更低
B+的内部结点并没有存储数据,因此其内部结点相对B树更小。如果把所有内部结点的关键字存放在同一盘块中,那么同一盘块所能容纳的关键字数量也越多。一次性读入内存中的需要查找的关键字也就越多。相对来说IO读写次数也就降低了。
B+树的查询效率更加稳定
l 由于非叶节点并不是最终指向文件内容的结点,而只是叶子结点中关键字的索引。所以任何关键字的查找必须走一条从根结点到叶子结点的路。所有关键字查询的路径长度相同,导致每一个数据的查询效率相当。
24. 聚集索引和非聚集索引区别?【重点】
聚合索引(clustered index):
聚集索引记录的排列顺序和索引的排列顺序一致,所以查询效率快,只要找到第一个索引值记录,其余就连续性的记录在物理也一样连续存放。
聚集索引对应的缺点就是修改慢, 因为为了保证表中记录的物理和索引顺序一致,在记录插入的时候,会对数据页重新排序。
非聚合索引(nonclustered index):
非聚集索引指定了表中记录的逻辑顺序,但是记录的物理顺序和索引不一定一致。
两种索引都采用B+树结构,非聚集索引的叶子层并不和实际数据页相重叠,而采用叶子层包含一个指向表中的记录在数据页中的指针方式。
非聚集索引层次多,不会造成数据重排。
根本区别:
聚集索引和非聚集索引的根本区别是表记录的排列顺序和与索引的排列顺序是否一致。
25. 常见的索引分类及其区别?【重点】
按索引的数据结构来划分:
Hash索引:
索引只包含哈希值与行指针,结构十分紧凑,索引速度很快;
只支持等值比较查询,不支持进行范围查询;
索引存储是无序的,所以不支持排序。
B树索引:
每个节点都存储key和data,所有节点组成这棵树。
本质上是多路平衡查找树,查找效率接近与二分查找法。
搜索有可能在非叶子结点结束。
叶节点包含的关键字和其他节点包含的关键字是不重复的。
数据是有序的,适合范围查询。
B+树索引:
是b树的一种变体,查询性能更好。
中间节点不保存数据,能容纳更多节点元素,所有的中间节点起到索引作用;
只有叶子节点存储数据,所有的叶子结点使用链表相连;
数据是有序的,适合进行范围查询;
位图索引:
就是用位图表示的索引,对列的每个键值建立一个位图。
占用的空间非常小,创建和使用非常快。
适合列的基数很少、可枚举、重复值很多的场景。
适合数据不会被经常更新的场景。
按照索引的类型划分:
唯一索引:不允许其中任何两行具有相同值的索引。
主键索引:可以认为是特殊的唯一索引,仅利用主键建立的索引。
单一索引:任何一个单一数据项建立的索引。
复合索引:多个数据列建立的索引。
聚簇索引:利用主键建立的索引,其物理存放顺序与主键顺序一致。因为数据只有一个物理存放顺序,所以一个表只有一个聚簇索引。
非聚簇索引(二级索引,辅助索引):除了聚簇索引之外,其余所有的索引都是非聚簇索引。
26. 数据库的五大范式?【了解】
第一范式:(确保每列保持原子性)所有字段值都是不可分解的原子值。
第二范式:(确保表中的每列都和主键相关)确保数据库表中的每一列都和主键相关,而不能只与主键的某一部分相关(主要针对联合主键而言)。
第三范式:(确保每列都和主键列直接相关,而不是间接相关)数据表中的每一列数据都和主键直接相关,而不能间接相关。
BCNF:在第三范式的基础上,数据库表中如果不存在任何字段对任一候选关键字段的传递函数依赖。一般一个数据库设计符合3NF或BCNF就可以了。
第四范式:禁止主键列和非主键列一对多关系不受约束(删除同一个数据表内多对多关系)。
第五范式:是最终范式。将表分割成尽可能小的表,为了排除在表中所有的冗余。