数据库程序员面试笔试宝典 -- 笔记整理

以下是《数据库程序员面试笔试宝典-机械工业出版社》的一些笔记整理。

待完成: 关系型数据库完整性规则,事务的分类,XA协议,CAP定理;更新丢失

  • 关系型数据库完整性规则:实体完整性规则(主键不能为空);参照完整性规则(外键必须在其对应的主键中能找到或者是空值);用户自定义完整性规则

  • 约束(Constraint)类型:主键(Primary Key)约束,唯一约束(Unique),检查约束,非空约束,外键(Foreign Key)约束

事务

  • 事务(Transaction)的概念:是一个操作序列,不可分割的工作单位,以BEGIN TRANSACTION开始,以ROLLBACK/COMMIT结束

  • 事务的特性(ACID特性):原子性(逻辑上是不可分割的操作单元,要么都执行要么都不执行);一致性:根据实际情况满足一致性状态;隔离性:针对并发事务而言,隔离并发运行的多个事务间的相互干扰;持久性:一旦事务提交成功,对数据的修改是永久性的

  • 事务的分类:

    • 扁平事务(Flat Transaction):所有操作处于同一层次,其间的操作是原子性的。主要限制是不能提交或回滚事务的某一部分
    • 带有保存点(Savepoints)的扁平事务:支持回滚到保存点
    • 链事务(Chained Transaction):一个事务由多个子事务链式组成。在提交一个事务时,释放不需要的数据对象,前一个事务的提交操作和下一个事务的开始操作合并成一个原子操作;与带有保存点的扁平事务的不同之处:链事务中的回滚只限于当前事务;链事务在执行COMMIT之后即释放了当前所持有的锁
    • 嵌套事务(Nested Transaction):层次结构框架,由一个顶层事务控制着各个层次的事务(子事务)
    • 分布式事务(Distributed):分布式环境下运行的扁平事务,需要根据数据所在位置访问网络中不同结点的数据库资源。也称XA事务,XA是一个分布式事务协议
  • XA协议:主要定义了事务管理器(Transaction Manager)和资源管理器(Resource Manager)之间的接口。XA事务是基于两阶段提交(Two-phase commit,2pc)协议实现的,准备阶段和提交阶段

  • 事务的四种隔离级别:当多个线程都开启事务操作数据库中的数据时,数据库需要进行隔离操作,以保证数据准确性。如果不考虑事务的隔离性,则会出现以下问题:

    • 脏读(Dirty Read):一个事务读取了被另一个事务(正在多次)修改、但尚未提交的数据,造成两个事务得到的数据不一致
    • 不可重复读(Nonrepeatable Read):在同一个事务中,某查询操作在一个时间读取某一行数据和之后一个时间读取该行数据,发现数据已经发生修改(可能被更新或删除了)
    • 幻读(Phantom Read):当同一查询多次执行时,由于其它的插入操作的事务提交,会导致每次返回不同的结果集(和不可重复读的区别:针对的是一个数据整体)
  • 四种隔离级别(级别提高并发性能降低):

    • 未提交读(Read Uncommited):该隔离级别中,所有事务都可以看到其它未提交事务的执行结果。不能避免上述三个问题
    • 提交读(Read Commited):Oracle数据库的默认隔离级别。一个事务只能看见已经提交的事务所作的改变。可避免脏读问题
    • 可重复读(Repeatable Read):MySQL的默认隔离级别(MySQL设置语句:SET GLOBAL|SESSION TRANSACTION ISOLATION LEVEL READ COMMITED)。可以确保同一个事务在多次读取同样的数据时得到相同的结果,解决了前两个问题
    • 可串行化(Serializable):通过强制事务排序,强制事务串行执行,使之不可能相互冲突,从而解决幻读问题。可能导致大量的超时现象和锁竞争,实际很少使用。
  • CAP定理:在一个分布式系统中,一致性(Consistancy)(所有结点在同一时间的数据完全一致)、可用性(Availability)(服务一直可用)、分区容错性(Partition Tolerance)(某结点故障不影响服务的提供)三者不可兼得。最多只能得其二。CA数据库(如图书管理系统)/CP数据库(如火车售票系统)/AP数据库(如博客)

  • 数据库的三级模式/三个抽象级别(数据库内部的体系结构):

    • 外模式(External Schema):也叫子模式或用户模式,面向具体的应用程序,是数据库用户最终能看见和使用的视图
    • 模式(Schema):也叫逻辑模式,数据库中全体数据的逻辑结构的描述
    • 内模式(Internal Schema):也称存储模式,是数据物理结构和存储方式的描述,依赖于逻辑结构,独立于具体的用户视图和存储设备。比如是否加密存储,压缩存储,使用B-tree还是哈希
  • 二级映像

    • 外模式/模式映像:外模式与模式之间的对应关系,当模式改变时,只需要相应改变映像,而外模式可保持不变。体现了逻辑独立性
    • 模式/内模式映像:数据库逻辑结构与存储结构之间的对应关系。物理独立性
  • 封锁类型:排他锁(X锁):事务对数据加上X锁时,只允许此事务读取和修改此数据;共享锁(S锁):加了S锁后,该事务和其它事务只能对数据进行读取而不能修改,直到该事务释放S锁

  • 三级封锁协议:

    • 一级:事务在修改数据之前必须先对其加X锁,直到事务结束才释放。可防止丢失修改(不能解决脏读问题??)
    • 二级:事务在读取数据之前必须先加S锁,读完后释放。可防止脏读,不能保证可重复读
    • 三级:事务读取数据之前加S锁,事务结束后释放,防止了不可重复读
  • 两段锁协议:事务必须严格分为两个阶段对数据进行加锁和解锁的操作,第一阶段加锁,第二阶段解锁。也就是说一个事务中一旦释放了锁,就不能再申请新锁了

  • 用于管理对共享资源的并发访问,保证数据库的完整性和一致性

  • 更新丢失:一个事务对数据的更新把另一个事务的更新覆盖了,只有第四级隔离可以防止,但效率太低。更新丢失分两类:第一类:在A事务撤销时,把已经提交的B事务的更新覆盖了;第二类:在A事务提交时覆盖了B已经提交的更新

  • 悲观锁:每次读取数据之前都会上锁,防止其它事务读取或修改数据;应用于数据更新比较频繁的场景

  • 乐观锁:查询数据时不会上锁,但是更新时会判断在此期间有没有别的事务更新这个数据,一般通过时间戳字段实现

  • SQL server中锁的分类:

    • 共享锁(share lock):执行SELECT时,数据库会自动使用S锁
    • 排他锁(exclusive lock):执行INSERT/UPDATE/DELETE时自动使用
    • 更新锁(update lock):意味着事务即将使用X锁?
    • 意向锁(intent lock):?
    • 架构锁(schema lock,Sch锁):
    • 大容量更新锁(bulk update lock):允许多个线程将数据并发大容量加载到同一个表
  • 死锁(具体知识看操作系统部分):多个进程发生等待(阻塞)时,每个都在等待被其它进程占用的资源;产生条件:互斥条件(一个资源一次只能被一个进程占用);请求与保持条件(当一个进程因请求资源而被阻塞时,对已获得的资源不会释放);不可剥夺条件(进程已获得的资源,在使用完之前,不能强行被剥夺);循环等待条件(若干进程之间形成一种首尾相接的循环等待资源关系)

  • 活锁:事务等待时间太长,似乎被锁住了,实际上有可能激活

  • MVCC(Multi-Version Concurrent Control,多版本并发控制):更新数据时,不会直接覆盖数据,而是生成一个新的版本的数据,但是同一时刻只有最新的版本号是有效的

  • 存储过程:用户定义的一系列SQL语句的集合,针对特定表和特定对象

  • 触发器:允许用户定义一组操作,但是其是不能被直接调用的,而是由一个事件来触发运行,比如增/删/改等操作。用于保证数据完整性。在数据库里以独立的对象存储。不能接受参数。滥用会造成维护困难

  • 游标:用于定位在结果集的特定行,以对特定行进行操作而不是整个结果集

  • 视图:从数据库的基本表中由查询选取出来的数据组成的虚拟表。数据库中只会存放视图的定义。隐藏了数据的复杂性,可控制对某些机密数据的访问提高了安全性

索引(Index)

  • 对某列创建索引(生成独立的索引表,方式如排序)可以大大加快检索速度,缺点是耗费时间和空间以及更新索引很慢。主键和外键必须有索引

  • 在哪些地方创建索引:

    • WHERE子句或连接条件经常引用的列
    • 某列经常作为最大最小值
    • 经常被查询并按一定规则返回
    • 经常出现在ORDER BY/GROUP BY/DISDINCT后面的字段
    • 只应建立在小字段上,而不要对大文本或图片建立索引
  • 唯一索引(Unique Indexes)/非唯一(Nonunique)索引:索引值是否唯一

  • 聚集(Clustered)索引/非聚集索引:对磁盘上存放数据的物理地址重新组织以使这些数据按照指定规则排序的一种索引(数据的物理排列顺序和索引排列顺序一致)。因此每张表只能创建一个聚集索引(因为要改变物理存储顺序)。优点是查询速度快,因为可以直接按照顺序得到需要数据的物理地址。缺点是进行修改的速度较慢。对于需要经常搜索范围的值很有效。非聚集索引只记录逻辑顺序,并不改变物理顺序。两者都用B+Tree来描述,非聚集索引的叶结点存放的是指向数据块的指针

  • 单列索引/复合(Composite)索引:基于单个列或多列建立的索引

  • 位图(Bitmap)索引

  • 分区(Partitioned)索引/非分区索引:把一个索引分成多个片段,可以访问更小的片段。二叉树和位图索引都可以分区,哈希索引不能分区。分区索引又分为本地分区索引和全局分区索引

  • 覆盖(Covering)索引:一个索引包含了所有满足查询所需要的数据,查询的时候只需要读取索引而不需要回表读取数据

  • 虚拟(Virtual)索引:模拟索引的存在而不用真正创建一个索引,用于快速测试创建索引对执行计划的影响。没有相关的索引段,不增加存储空间的使用

  • 不可见(Invisible)索引

  • E-R模型

  • 数据字典

  • 数据库安全

  • 热备份:在数据库运行的情况下,采用归档方式备份的方法。优点:可按表或用户备份,备份时数据库仍可使用,可恢复至任一时间点。但是不能出错

  • 冷备份:数据库正常关闭后,将关键性文件复制到另一位置的备份方式。优点:操作简单快速,恢复简单

  • OLTP(OnLine Transaction Processing,联机事务处理):主要是执行基本的事务,如增删改,一般对实时性要求高,数据量不是很大,并发性要求高

  • OLAP(OnLine Analytical Processing,联机分析处理):支持复杂的分析操作,侧重决策支持

  • 数据库连接池:负责分配、管理和释放数据库连接,允许应用程序重复使用现有的连接而不需要重新建立连接。有最小连接数和最大连接数。连接池将数据库连接到中间服务器上,这样应用程序每次连接时就只需要操作服务器上的连接

你可能感兴趣的:(数据库程序员面试笔试宝典 -- 笔记整理)