26.简述B树的结构及特点?
对于一个M阶的B树有以下特征:
第一任何非叶子节点最多只有M个儿子,且M > 2; 根节点的儿子数量范围为[2,M]; 除根节点 以外的非叶子节点的儿子数量为[M/2,M],向上取整,M/2是由于当某个节点达到M个节点信息时,会进行拆分为两个叶子节点。 非叶子节点的关键字数量 = 叶子数量 - 1; 所有的叶子节点位于同一层; k个关键字把节点拆成k+1段,分别指向k+1个儿子,同时满足查找树的大小关系; 每个节点除了存储索引外还保存该索引对应数据的地址;
27.简述B+树的结构及特点?
对于一个M阶的B树有以下特征:
有k个子树的中间节点包含有k个元素(B树中是k-1个元素),每个元素不保存数据,只用来索引,所有数据都保存在叶子节点。 所有的叶子结点中包含了全部元素的信息,及指向含这些元素记录的指针,且叶子结点本身依关键字的大小自小而大顺序链接,形成一个有序的链表。 所有的中间节点元素都同时存在于子节点,在子节点元素中是最大(或最小)元素。 由于每个节点只存索引,因此每个页存储的数据变多,可减少IO次数。
28.数据库如何保证事务的ACID特性?
原子性:使用innodb的undo log(回滚日志),undo log记录了回滚需要的信息,当事务执行失败或调用了rollback,导致事务需要回滚,便可以利用undo log中的信息将数据回滚到修改之前的样子。 隔离性: 使用悲观锁和乐观锁对事务处理。 持久性:使用innodb的redo log(重写日志), 记录的是数据页的物理修改,而不是某一行或某几行修改成怎样怎样,它用来恢复提交后的物理数据页(恢复数据页,且只能恢复到最后一次提交的位置);当做数据修改的时候,不仅在内存中操作,还会在redo log中记录这次操作。当事务提交的时候,会将redo log日志进行刷盘(redo log一部分在内存中,一部分在磁盘上)。当数据库宕机重启的时候,会将redo log中的内容恢复到数据库中,再根据undo log和binlog内容决定回滚数据还是提交数据。 一致性:通过原子性、隔离性、持久性来保证一致性。
29.简述使用redo log的好处?
redo log体积小,毕竟只记录了哪一页修改了啥,因此体积小,刷盘快。 redo log是一直往末尾进行追加,属于顺序IO。效率显然比随机IO来的快。
30.如何解决数据库高并发问题?
在web服务框架中加入缓存。在服务器与数据库层之间加入缓存层,将高频访问的数据存入缓存中,减少数据库的读取负担。 增加数据库索引,进而提高查询速度。(不过索引太多会导致速度变慢,并且数据库的写入会导致索引的更新,也会导致速度变慢) 主从读写分离,让主服务器负责写,从服务器负责读。 将数据库进行拆分,使得数据库的表尽可能小,提高查询的速度。 使用分布式架构,分散计算压力。