1. 索引
1.1 B+树索引(InnoDB)
- 叶子结点存储数据,非叶子结点不存储数据,只存储索引;
- 叶子结点数据按索引有序排列,各个块之间通过指针相连,以提高区间查询速度;
注意上图是主键索引,如果是非主键索引,那么查找流程是这样的:首先,在非主键索引树上查找数据对应的主键;再通过查找到的主键,去主键索引树上通过主键查找数据。如下图所示,是非主键索引:
1.2 B树和B+树
B树每个节点上都存有记录,遍历数据需要遍历所有的树节点,不支持范围查找。B+树记录的信息只存在叶子节点上,且叶子节点通过指针有序的连接,支持范围查找,只需要遍历叶子节点就可以遍历全部的数据。
最核心的问题就说B+树支持范围查找,B树不支持。
1.2、Hash索引
如下图所示,通过链接法解决冲突,查找效率高,但不支持范围查找,所以一般不用;
1.2、聚簇索引、非聚簇索引
- 聚集索引:指叶子结点包含了完整的索引记录和数据记录,如InnoDB的B+树;
- 非聚集索引:指叶子结点不包含数据记录,指包含索引,如MylSam的B+树;
1.3、为什么InnoDB数据库要为每张表都建立一个主键,且主键建议用自增
因为InnoDB数据库会默认为每张表建立一个主键索引,递增的主键索引能可控的提高查询速度;如果不设置主键,将会默认将从第一列数据开始挑选,建立唯一索引,不可控。
自增更方便索引树建立,不会使得树结点过多的分裂。
1.4、联合索引
联合索引指建立索引树的时候按多个索引顺序的进行排序;例如联合索引有(索引1,索引2,索引3),那么一组数据如何比大小,就是先比较索引1这个数据项,相等再比较索引2,依次类推,直至能比较出两条数据的大小。
1.5、索引优缺点
-
优点:
- 大大减少查找范围,提高查询速度;
- 索引会加载在内存中,使得只需要一次磁盘IO,就能找到数据;
- 通过创建唯一索引,能够保证数据的唯一性;
- 加速两个表之间的连接;
-
缺点:
- 创建和维护索引需要消耗时间;
- 索引需要占用一定的磁盘空间;
1.6、关系型和非关系型数据库的区别你了解多少
- 关系型数据库
- 采用关系表的方式存储数据;
- 支持复杂的查询方法;
- 非关系型数据库
- 采用键值对的方式存储数据;
- 数据读写效率高;
- 支持多种类型的存储,如:图片,文件。
1.7、Innodb为什么要用自增id作为主键?
InonoDB会将主键作为索引建立索引树,在索引数的创建过程中,主键数据会顺序的插入索引树,当一页满了,再建立第二页。如果不是顺序递增的ID作为主键,那么可能会常常插入页的中间,造成频繁的移动和分页,影响插入效率,并且会导致大量碎片,得到不够紧凑的索引。
2、事务并发
2.1、事务是什么及四大特性
事务是mysql中原子执行的任务,一个事务要么全部执行,要么全部不执行。
- 原子性:要么全部执行,要么全部不执行。执行时发生错误,事务会回滚,撤销已执行的全部操作。主要是用日志记录事务历史的执行命令,当发生错误的时候使用undo log回滚日志撤销历史操作实现的。
- 一致性:事务开始前和结束后,数据库的完整性约束没有被破坏。
- 隔离性:多个并发事务的执行,互不干扰。通过实现四个隔离级别实现的。
- 持久性:事务一旦提交,对数据库的改变是永久的。将数据存入磁盘中,使用readlog防止数据丢失。
2.2、事务并发可能导致的问题
- 脏读:多个事务并发执行时,可能会导致事务读取某个事务的中间状态数据。导致脏读。
- 不可重复读:事务A读取数据后,另外一个事务对数据进行了修改,使得事务A重新读取验证时,状态不一致。
- 丢失修改:事务对某个数据的修改被另外的事务覆盖,导致修改丢失。
- 幻读:事务A首先范围查询数据得到2条,此时事务B向该范围内插入了一条数据,事务A再次查询时出现了三条数据,导致状态不一致,出现幻读问题,强调的是范围。
2.3、事务的隔离级别
- 未提交读:该级别会让发生修改的事务,即使未提交,其它事务也看得到,如果事务回滚,那么将导致其它事务读取错误的中间状态数据。例如,事务A将数据从50改为100但是还未提交,此时事务B读取了该数据结果为100,而事务A回滚撤销了修改,那么事务B读取的就说错误的中间状态数据。
- 提交读:该级别让事务在提交之前对某个数据的操作其它事务是不可见的,阻止了脏读。但是幻读和不可重复读也有可能发生。
- 重复读:对一个记录读取多次,才认为其是合法的,阻止了不可重复读的问题。但幻读有可能发生。
- 可串行化读:事务并行执行的结果和串行化一致。该级别可以防止脏读、不可重复读、幻读。
3、MySQL锁
3.1. 锁的种类及使用场景
-
按锁的使用场景可以分为:
- 悲观锁:操作数据前对数据加锁,操作完成后才解锁。用于对数据同步要求较高的场景。
- 乐观锁:不对数据加锁,只有在提交时检查是否发生冲突,发生冲突将冲突结果告知用户由用户处理冲突。用于读多写少的场景。
-
按锁的粒度可以分为:
- 行锁
- 表锁
- 页锁
-
按锁的级别可以分为:
- 共享锁
- 排他锁
- 意向锁
4、视图
4.1 什么是视图?
视图是虚拟的表,是对基表的组合引用,主要用来更直观的将数据展示给用户,方便查询检索,保护底层基表数据。一般不用于更新修改数据。
5、数据库三范式
- 第一范式:所有的列都是不可分割的数据项。
- 第二范式:属性完全依赖于主属性。
- 第三范式:不存在属性依赖于非主属性。
6、死锁的必要条件
- 请求与保持等待
- 不可剥脱
- 循环等待:经
- 互斥:一个资源只能被一个进程使用