数据库系统概述
基本概念
- 数据库
相关联的数据的集合 - 数据库管理系统
软件系统,包括存储管理、安全性、完整性、并发控制、故障恢复等 - 数据库系统DBS
一个环境,包括DB,DBMS,数据库管理员,应用程序,最终用户等 - 数据字典data dictionary
是DBMS中的特殊文件,存储数据库的一些说明信息,即元数据。数据的数据,对数据结构和数据文件本身进行描述和说明。因此最终操作时只需要指出所需要操作的数据库对象名称即可。 - 中间件
屏蔽不同操作系统,网络协议或者DBMS之间的差距,包括ODBC或者JDBC - 视图view
不同用户对同一数据库的每一种理解。
关系型数据库和非关系型数据库
- 关系型数据库:mysql /oracle/sql server/sqlite
- 概念:指采用了关系模型来组织数据的数据库。最典型的数据结构是表,由二维表及其之间的联系所组成的一个数据组织。
- 特点:事务一致性,具有ACID的特点,适用于银行系统
- 优点:①易于维护:都是使用表结构,格式一致,有丰富的完整性约束;②使用方便:SQL语言通用,可用于复杂查询;③复杂操作:支持SQL,可用于一个表以及多个表之间非常复杂的查询④易于理解
- 缺点:①读写性能比较差,尤其是海量数据的高效率读写②固定的表结构,灵活度稍欠,缺乏高扩展性和可用性(很难横向扩展:主从复制,集群和分片(sharding))③高并发读写需求,传统关系型数据库来说,硬盘I/O是一个很大的瓶颈。④多表关联查询导致性能欠佳
- 非关系型数据库:redis / hbase /mongoDB /CouchDB /Neo4J
- 概念:是一种数据结构化存储方法的集合,可以是文档或者键值对等。适用于SNS(对并发读写要求高,扩展性高,数据经常变动)
- 分类:文档型(可以在海量数据中快速查询,couchDB)、key-value型(具有极高并发读写性能。redis、日志系统)、列式数据库(分布式文件系统,可扩展性较高)、图形数据库(社交网络、推荐系统)
- 优点:①格式灵活:存储数据的格式可以是key,value形式、文档形式、图片形式等等,文档形式、图片形式等等,使用灵活,应用场景广泛,而关系型数据库则只支持基础类型。②速度快:nosql可以使用硬盘或者随机存储器作为载体,而关系型数据库只能使用硬盘③高扩展性④成本低:nosql数据库部署简单,基本都是开源软件
- 缺点:①不提供sql支持,学习和使用成本较高②无事务处理③数据结构相对复杂,复杂查询方面稍欠。
redis
- Redis所有的数据结构都以唯一的key字符串作为名称,然后通过这个唯一key值来获取相应的 value 数据。不同类型的数据结构的差异就在于value结构不一样。
- 基本数据结构:string、list(链表)、hash(无序字典)、set、zset
- 常用命令:del、incr(递增)、type(查询键类型,如string)、mset(批量存放键值)、sadd(集合中存储值)、smember(获取所有元素)
数据库引擎MyISAM与InnoDB 的区别
- InnoDB支持事务,MyISAM不支持,对于InnoDB每一条SQL语言都默认封装成事务,自动提交,这样会影响速度,所以最好把多条SQL语言放在begin和commit之间,组成一个事务;
- InnoDB支持外键,而MyISAM不支持。对一个包含外键的InnoDB表转为MYISAM会失败;
- InnoDB是聚集索引,使用B+Tree作为索引结构,数据文件是和(主键)索引绑在一起的(表数据文件本身就是按B+Tree组织的一个索引结构),必须要有主键,通过主键索引效率很高。但是辅助索引需要两次查询,先查询到主键,然后再通过主键查询到数据。因此,主键不应该过大,因为主键太大,其他索引也都会很大。 MyISAM是非聚集索引,也是使用B+Tree作为索引结构,索引和数据文件是分离的,索引保存的是数据文件的指针。主键索引和辅助索引是独立的。
- 也就是说:InnoDB的B+树主键索引的叶子节点就是数据文件,辅助索引的叶子节点是主键的值;而MyISAM的B+树主键索引和辅助索引的叶子节点都是数据文件的地址指针。
- InnoDB不保存表的具体行数,执行select count(*) from table时需要全表扫描。而MyISAM用一个变量保存了整个表的行数,执行上述语句时只需要读出该变量即可,速度很快
- MyISAM表格可以被压缩后进行查询操作
- InnoDB支持表、行(默认)级锁,而MyISAM支持表级锁
- innodb引擎的4大特性:插入缓冲(insert buffer),二次写(double write),自适应哈希索引(ahi),预读(read ahead)
OLTP联机事务处理online transaction processing
一类应用,中底层、日常业务处理、 提高业务处理效率、响应时间块,应用于管理信息系统MIS。
OLAP联机分析处理
通常需要大量数据查询,注重数据分析,面向高层,辅助领导决策。应用于决策支持系统DSS(decision support system)
数据仓库
特征:面向主题(eg产品、客户、开发商)集成(多维数据)稳定(历史数据)随时间变化(时序数据)
C/S模式
- 两层结构
客户:表示逻辑、业务逻辑——网络——数据库server:数据服务——数据库 - 三层结构
客户:表示逻辑——应用服务器:业务逻辑——DBMS服务器:数据服务——数据库 - B/S模式
C/S缺陷特别突出,软件端规模扩大特别困难。
浏览器——服务器——应用服务器——DBMS服务器——数据库
数据库语言
- 数据定义子语言DDL:create、drop、alter。定义一种结构
- 数据操纵子语言DML:增删改查Insert/Delete/Update/Select。提供给用户操纵数据的一个界面
- 数据控制子语言DCL:事务控制、安全权限管理。管理或者控制界面。grant授权,revoke撤销授权,deny拒绝授权
- 事务控制语言TCL:SAVEPOINT设置保存点,ROLLBACK回滚,COMMIT提交
- SQL语言:结构化查询语言structured query language
使用方式:①用户直接在关系型数据库管理系统RDBMS中使用SQL命令交互式使用。 ②嵌入式方式,通过开发的应用系统与RDBMS交互
数据抽象、数据模型、数据模式及其相互关系
- 数据抽象
数据抽取的过程,将现实的数据放到数据库中。 - 数据模型
用于组织数据,是数据抽象的工具。
数据模型三要素:①数据结构:实体与实体间联系②数据操作:增删改查③数据约束:数据本身、数据与数据之间的约束
数据模型的分类:①概念/语义/高级数据模型(常用为实体联系模型ER)(与具体DBMS无关)②逻辑数据模型(包括关系、层次HDM、网状NDM)③物理数据模型(涉及数据的物理存储结构)(由编制DBMS的人员关心) - 数据模式
数据抽象的结果
DBMS的优点
- 数据独立性
- 高效数据访问
- 数据完整性与安全性:通过数据的完整性约束或者限制(integrity constraints,IC)来实现完整性功能,通过访问控制(access control)实现安全性
- 数据管理
- 并发访问与故障恢复
- 缩短应用开发时间
DBMS的五大基本功能(或四大基本功能+数据结构)
- 数据独立性:数据结构和数据文件从应用程序中分离开
- 完整性
- 安全性
- 故障恢复
- 并发控制
不使用DBMS的情形
- 苛刻的实时环境:eg前端应用
- 操作少,代码精炼
- 操纵的数据是非结构化或者半结构化的数据:可以存储,但不能用sql处理
数据库三级抽象层次/数据库三级模式结构
- 视图抽象:得到外模式
- 概念抽象:得到概念模式/全局模式(使用高级数据模型ERM/概念数据模型/语义数据模型(三者为同一个事物))
- 物理抽象:得到内模式/关系模式(数据库逻辑设计、模式优化阶段)
数据库设计步骤
①需求分析:DFD数据流程图、DD数据字典。对应抽象层次的现实系统描述
②概念数据库设计:使用高级数据模型。现实系统→外模式的视图抽象→概念模式的概念抽象
③逻辑数据库设计:选一款RDBMS产品,将E-R模型或者对象模型转换为关系模型对应的模式(关系模式)schema。得到物理抽象及内模式
④模式优化:利用规范化理论优化,得到数据库抽象层次的物理抽象与内模式
⑤物理数据库设计:负载、性能要求,设计并选择物理存取方式
⑥安全设计:确定哪些用户可以访问哪些数据
索引
- 索引的类别
①聚簇索引/主键索引:所有行数都会按照主键索引进行排序
②非聚簇索引:给普通字段加上索引
③联合索引:好几个字段组成的索引 - 非聚集索引和聚集索引的区别
通过聚集索引可以查到需要查找的数据, 而通过非聚集索引可以查到记录对应的主键值 , 再使用主键的值通过聚集索引查找到需要的数据,即聚集索引(主键)是通往真实数据所在的唯一路径。 - 最左前缀原则:即最左优先,在检索数据时从联合索引的最左边开始匹配
- 当b+树的数据项是复合的数据结构,比如(name,age,sex)的时候,b+数是按照从左到右的顺序来建立搜索树的。所以当name字段缺失时无法走索引。
- 建立联合索引时需要选择索引优先级,设a最高,则只有sql查询条件里有a字段时才会使用该索引
- 索引的优点
①通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性。
②可以大大加快数据的检索速度,这也是创建索引的最主要的原因。
③可以加速表和表之间的连接,特别是在实现数据的参考完整性方面特别有意义。
④在使用分组和排序子句进行数据检索时,同样可以显著减少查询中分组和排序的时间。
⑤通过使用索引,可以在查询的过程中,使用优化隐藏器,提高系统的性能。 - 索引的缺点
①创建索引和维护索引要耗费时间,这种时间随着数据量的增加而增加。
②索引需要占物理空间,除了数据表占数据空间之外,每一个索引还要占一定的物理空间,如果要建立聚簇索引,那么需要的空间就会更大。
③当对表中的数据进行增加、删除和修改的时候,索引也要动态的维护,这样就降低了数据的维护速度。 - 应该创建索引的列
①在经常需要搜索的列上,可以加快搜索的速度
②在作为主键的列上,强制该列的唯一性和组织表中数据的排列结构
③在经常用在连接的列上,这些列主要是一些外键,可以加快连接的速度
④在经常需要根据范围进行搜索的列上创建索引,因为索引已经排序,其指定的范围是连续的
⑤在经常需要排序的列上创建索引,因为索引已经排序,这样查询可以利用索引的排序,加快排序查询时间
⑥在经常使用在WHERE子句中的列上面创建索引,加快条件的判断速度。
索引的底层实现
-
B树
非叶节点结构:
- 特点:
①每个节点至多可以拥有m棵子树
②若根节点不是终端结点,则至少有两棵子树
③叶子节在相同的层,并且这些节点不带信息(指向这些节点的指针为空)
④任何一个关键字出现且只出现在一个节点中
⑤搜索有可能在非叶子节点结束
⑥其搜索性能等价于在关键字集合内做一次二分查找 - 插入:分裂结点。删除:借兄弟结点
- 特点:
-
B+树
- 特点
①磁盘的读写代价更低,更加适合文件系统
②所有的关键字全部存储在叶子节点上,且叶子节点本身根据关键字自小而大顺序连接。
③所有的中间节点在子节点中是最大/最小的元素(自己定)
④B+树中叶节点包含【全部关键信息】,即在非叶节点中出现的关键字(副本/索引)也会在叶节点中出现
⑤通常B+树有两个头指针:一个指向根节点,一个指向关键字最小的叶节点,因此可以对B+树进行两种查找:①从最小关键字开始顺序查找(叶节点从左往右)(提高区间查询效率),②从根节点开始多路查找(从上到下)
⑥B+树的查找终止条件一定要到叶节点时才停止,在非叶节点查找到了关键字后仍然要向下查找。则无论查找成功与否,每次查找都是一条从根节点到叶节点的路径
- 特点
-
使用B或B+树而非红黑树的原因
- 索引本身也很大,往往以索引文件的形式存储在磁盘上。因此索引查找过程中就要产生磁盘I/O消耗,相对于内存存取,I/O存取的消耗要高几个数量级,所以评价一个数据结构作为索引的优劣最重要的指标就是在查找过程中磁盘I/O操作次数的渐进复杂度。
- 主存存取:随机读写存储器RAM作为主存,使用地址总线和数据总线与系统进行信息交换。因此主存存取的时间仅与存取次数呈线性关系,与数据在主存中的物理距离无关。
- 磁盘存取:磁盘I/O存在机械运动耗费。磁盘中每个扇区是磁盘最小存储单元。读取数据时,磁盘确定物理地址(磁道与扇区),随后使磁头(沿切线方向)移动对准相应磁道(寻道),随后磁盘将目标扇区旋转到磁头下(旋转时间)。物理特性与机械运动消耗导致磁盘存取速度很慢。因此存在预读现象,即即使只需要一个字节,磁盘也会从这个位置开始,顺序向后读取一定长度的数据放入内存。预读的长度一般为页(page)的整倍数。主存和磁盘以页为单位交换数据。
- 对B树,检索一次最多需要访问h个节点。因此将一个节点的大小设为等于一个页,这样每个节点只需要一次I/O就可以完全载入。每次新建节点时,直接申请一个页的空间,这样就保证一个节点物理上也存储在一个页里,加之计算机存储分配都是按页对齐的,就实现了一个node只需一次I/O。B-Tree中一次检索最多需要h-1次I/O(根节点常驻内存)。B树渐进复杂度为O(h)=O(logdN),实际中d很大,h很小,因此效率很高。///换言之,一个节点可以存放多个数据,查找一个节点的时候可以有多个元素,大大提升查找效率
- 对红黑树,h明显要深的多。由于逻辑上很近的节点(父子)物理上可能很远,无法利用局部性,所以红黑树的I/O渐进复杂度也为O(h),效率明显比B-Tree差很多。
MySQL数据库优化
- 选取最适用的字段属性
如char()长度 - 使用连接(JOIN)来代替子查询(Sub-Queries),因为不需要对子查询结果创建临时表
- 使用联合(UNION)来代替手动创建的临时表:它可以把需要使用临时表的两条或更多的select查询合并的一个查询中。在客户端的查询会话结束的时候,临时表会被自动删除,从而保证数据库整齐、高效。
- 使用事务:可以保持数据库中数据的一致性和完整性。事物以BEGIN关键字开始,COMMIT关键字结束。在这之间的一条SQL操作失败,那么,ROLLBACK命令就可以把数据库恢复到BEGIN开始之前的状态。
- 锁定表:保证在UNLOCKTABLES命令被执行之前,不会有其它的访问来对表进行插入、更新或者删除的操作。
- 使用外键:保证数据间的关联性。
- 使用索引
- 三少原则:表、表中字段、表中组合组件与组合索引
- 最好不要给数据库留NULL,因为null也会占用空间。
- 导致全局扫描的情况(where子句中):应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描(where num is null)。另外避免在 where 子句中使用 != 或 <> 操作符,否则将引擎放弃使用索引而进行全表扫描。应尽量避免在 where 子句中使用 or 来连接条件,如果一个字段有索引,一个字段没有索引,将导致引擎放弃使用索引而进行全表扫描。in 和 not in 也要慎用,否则会导致全表扫描
- Update 语句,如果只更改1、2个字段,不要Update全部字段,否则频繁调用会引起明显的性能消耗,同时带来大量日志
- select count(*) from table;这样不带任何条件的count会引起全表扫描,并且没有任何业务意义,是一定要杜绝的
- 索引并不是越多越好,索引固然可以提高相应的 select 的效率,但同时也降低了 insert 及 update 的效率,因为 insert 或 update 时有可能会重建索引。一个表的索引数最好不要超过6个
- 主从复制与读写分离:主数据库负责写操作,多台从数据库做负载均衡,负责读操作
- 分表:垂直拆分和水平拆分
高级(概念)数据模型
数据结构三要素中只包括数据结构、数据约束(因为其操作不被DBMS支持)
实体联系模型E-R模型是一种主要的高级数据模型
- 实体
具体或者抽象的对象 - 实体型
同类实体的集合。可简称实体 - 属性
实体的特征。属性的取值范围为域
按结构分包括简单属性、复合属性、子属性等
按取值分包括单值属性、多值属性、导出/派生属性(可推导得出)、空值属性(不确定或没有。true&null=null) - 键key
具有唯一标识特征的一个或者一组属性 - 候选键
没有冗余属性的键。eg姓名√,姓名+性别× - 主键
指定的一个候选键,作为描述实体的唯一标志 - 弱实体
指没有键属性的实体。需要通过识别实体型、识别联系、部分键来识别 - E-R图示
实体型用长方形,属性用椭圆,主键用下划线,联系用菱形表示 - 联系
实体之间的关联,用属性描述。主键一般由所关联实体的主键组成 - (完整性)约束
一般性约束:1:1、1:n、m:n
键约束:在一个联系实例中,一个关联的实体最多只能出现在一个联系实例中。键约束只在1:1、n:1(箭头在n方)中有
参与约束:实体如何参与到联系中(完全参与all、部分参与part) - 评价数据模型
真实描述现实系统
容易被业务用户理解
容易被计算机实现
关系数据模型RM
数据结构三要素:包括数据结构、数据操作、数据约束
数据结构
- 关系模式:表+字段
- 关系实例:某项记录
- 候选键、主键、外键
数据操作
增删改查
完整性约束
- 域约束:对数据类型的约束
- 主键约束:表中只有一个主键,主键值唯一且非空
- 唯一约束:候选键值唯一,最多一个空值
- 外键约束(参照完整性约束,需要在表中定义)
主表的修改和删除(级联修改cascade,受影响外键set null or set default,不允许修改主表的主键no action。删除同理)
从表的插入、修改(参照reference主表)
实现外键约束:在从表上定义外键约束、触发器
应该在从表上定义外键约束 - 一般性约束
检查约束/表约束/表限制(单表):某列的取值范围、列间的关系
断言(多表):表间是否满足指定条件
ER模型向关系模型的转换
- 转换规则
有联系则转换为表。三元联系(m:n:1中m和n都有箭头)m主键,n候选键,三者均为外键 - 1:1
联系的属性和另一方的主键移动到该方 - 1:n
只能移动到n方 - m:n
单独建表,一个联合主键,分别为外键
关系代数
- 选择σ:
σ(grade>=3)(S2),第一个括号为σ的下标
SELECT * FROM S2 WHERE grade >= 3 - 投影π:π(grade)(S2),实际DBMS中保留重复元组
SELECT grade FROM S2 - 并UNION:R∪S
SELECT * FROM S1 UNION SELECT * FROM S2 - 交INTERSECTION:R∩S
SELECT * FROM S1 INTERSECT SELECT * FROM S2
或SELECT * FROM S1 WHERE S1.sid IN(SELECT S2.sid FROM S2) - SET-DIFFERENCE:R-S
SELECT * FROM S1 EXCEPT SELECT * FROM S2
或SELECT * FROM S1 WHERE S1.sid NOT IN(SELECT S2.sid FROM S2) - 笛卡尔乘积CROSS-PRODUCT:R×S,即R中的每一个元组都与S中的每一个元组联结一遍
SELECT S1.sid, name, age, grade, S2.sid, cid, score FROM S1, S2 - 改名:ρ(新表名(列数→新列名),S1*E1)
- 联结操作
- 连接分类:①INNER JOIN内连接,取交集。②LEFT JOIN左外连接,显示左边所有的和右边表共有的,即左边的表。③右连接。④OUTER JOIN外连接/全连接,查询左表右表所有数据,并去掉重复的(MYSQL不支持)
条件联结:σ(S1.sid<S2.sid)(S1×S2)
SELECT S1.name, S2.name
FROM S1 CROSS JOIN S2 (或写为S1 CROSS JOIN S2)
WHERE S1.sid<S2.sid
等联结:条件联结特例,要求条件表达式只能有“=”号
SELECT S1.name, S2.name
FROM S1, S2
WHERE S1.sid=S2.sid
自然联结:等联结特例,还要求等式中涉及的字段名必须相同
SELECT S1.sid, name, age
FROM S1 NATURAL JOIN S2
或
SELECT S1.sid, name, age, S2.sid, cid, score
FROM S1, S2
WHERE S1.sid=s2.sid
外联结(涉及有空值的自然联结,前面三种都是内联结)
左外联结,对于R△△S,S中没有匹配R的行则以null表示,还包括来自R的不满足自然联结条件的行。
SELECT S1.sid, cid
FROM S1 NATURAL LEFT OUTER JOIN S2 ON S1.sid=S2.sid
右外联结同理
全联结:左外联结和右外联结的并集
- 连接分类:①INNER JOIN内连接,取交集。②LEFT JOIN左外连接,显示左边所有的和右边表共有的,即左边的表。③右连接。④OUTER JOIN外连接/全连接,查询左表右表所有数据,并去掉重复的(MYSQL不支持)
数据库安全性
访问控制类型
- 自主式访问控制DAC:基于访问权限概念,通过授权GRANT和撤权REVOKE方式来实现。
- 权限类型:角色权限,数据库对象权限
- SQL SERVER安全体系:DBMS或数据库服务器级、数据库级、语句与对象级
- 强制访问控制MAC:基于全系统范围策略,客体object(各种数据库对象)和主体subject(用户、计算机进程等)分别具有相应的安全等级
- 基于角色的访问控制RBAC
数据库完整性
完整性约束类型
- 静态完整性约束/状态约束
隐式约束:隐含于数据模型中的完整性约束,一般由数据库的数据定义语言DDL说明,如域约束、主键约束、唯一约束、外键约束、一般性约束
固有约束:数据模型固有的约束,如第一范式
显式约束:根据应用进行显示的定义与说明。如过程化定义、断言、触发器 - 动态完整性约束
数据库从一个正确状态向另一个正确状态变化过程中必须遵循的条件,eg年龄只能增长
完整性约束的定义
- 固有约束:在DBMS实现时已经考虑过。
- 隐式约束:使用数据定义语言DDL定义说明
- 显式约束
- 过程化定义:使用过程或者函数来定义和验证。如果违反给定的约束,则回退rollback事务。
- 断言assertion:CREATE ASSERTION 约束名
CHECK 条件表达式 - 触发器:包括激活触发器的事件、测试条件以及应执行的动作
故障恢复技术
事务管理概况
-
事务定义
由多个步骤组成,全部完成才可提交commit。否则需要撤销undo或者回退rollback -
事务特性ACID
原子性Atomicity:事务中的所有操作是原子性的,即操作集合不可再分割
一致性Consistency:事务执行前后,数据库的完整性约束没有被破坏,即数据库的完整性与业务逻辑上的一致性没有被破坏
隔离性Isolation:多个事务应相互隔离,任一事务的更新操作对数据库的变化只有成功提交后才对其他事务可见。
持久性Durability:一个事务一旦提交,其对数据库中数据的更新是持久的,持久保留在数据库中,不会被回滚,,即便是在数据库系统遇到故障的情况下也不会丢失提交事务的操作。 -
事务管理的内容:故障恢复、并发控制
-
数据库的隔离级别
脏读 不可重复读 幻读 Read uncommitted √ √ √ Read committed × √ √ Repeatable read × × √ Serializable × × × - read uncommited–读未提交
该隔离级别指即使一个事务的更新语句没有提交,但是别的事务可以读到这个改变,几种异常情况都可能出现。极易出错,没有安全性可言,基本不会使用。 - read committed --读已提交
该隔离级别指一个事务只能看到其他事务的已经提交的更新,看不到未提交的更新,消除了脏读和第一类丢失更新,这是大多数数据库的默认隔离级别,如Oracle,Sqlserver。 - repeatable read --可重复读
该隔离级别指一个事务中进行两次或多次同样的对于数据内容的查询,得到的结果是一样的,但不保证对于数据条数的查询是一样的,只要存在读改行数据就禁止写,消除了不可重复读和第二类更新丢失,这是Mysql数据库的默认隔离级别。 - serializable --序列化读
意思是说这个事务执行的时候不允许别的事务并发写操作的执行.完全串行化的读,只要存在读就禁止写,但可以同时读,消除了幻读。这是事务隔离的最高级别,虽然最安全最省心,但是效率太低,一般不会用。
- read uncommited–读未提交
故障恢复
- 故障类型
事务故障
系统故障
介质故障 - 前像和后像:事务更新数据所在物理块在更新前/更新后的映像
- 依据:事务是否提交
- 恢复的原则:提交的事务用后像重做(将后像写入磁盘);未提交的事务用前像回退(将前像写入磁盘)。
- 基于多副本的恢复技术
可靠性技术:镜像磁盘、双工磁盘、镜像服务器、cluster群集系统
数据库复制:①对等复制:副本之间全连接,且每个副本都可以进行事务读写。②主从复制。③级联复制
数据库镜像:主数据库和镜像数据库
日志结构
- 日志基本结构(以下都是链表)
①活动事务表ATL:记录正在执行但尚未提交的事务标识符TID
②提交事务表CTL:记录已经提交事务的标识符
③前像
④后像 - 提交事务的步骤
①将TID放入CTL表中
②从ATL表中删除TID - 提交更新事务遵循的规则
提交规则:后像在事务提交前写入磁盘(因为事务一旦提交,对数据的更新就永久有效)
先记后写规则WAL:后像写入前先将前像写入日志,以便事务失败后,撤销事务所做的更新 - 数据库恢复后对日志的处理
①不保留已提交事务的前像(因为再次恢复只会用后像重做)
②有选择地保留后像(磁盘故障几率小,由用户选择是否保留)
③合并后像(只保留最近的后像)
并发控制
关于并发控制
- 事务最后的行动:提交、回退
- 并发的目的:①提高系统资源利用率。②改善短事务的响应时间
- 并发导致的问题:①读脏数据:读未提交的数据,即读到有可能要回退的尚未提交的数据(读到另一个事务中途产生的数据)。②幻读:两次读到的值不一样,该值在两次读之间被其他事务修改③不可重复读:和幻度类似,但是不可重复读是由于其他事务更改update的数据,而幻读读取了其他事务新增insert的数据。
- 不可重复度:使用行级锁,锁定该行,在事务多次读取操作完成后才释放该锁
- 幻读:使用表级锁,锁定整张表,在事务多次读取数据总量后才释放该锁。
并发控制的正确性准则
- 并发控制原则:既要将各事务的操作交错执行以充分利用系统资源,又要避免各事务的数据访问冲突
- 事务调度原则:不同事务可以相互交叉,但必须保持各事务内部的操作顺序
- 并发调度可串行化测试
①构造前驱图:Ri(x)在Wj(x)之前,W在R之前,W在W之前则将节点连线
②若无回路则可串行化。然后按从头到尾的节点顺序写出事务执行的顺序,R在W之前
基于锁的并发控制协议
- X锁协议(排他锁exclusive)
事务A对对象T加X锁以后,其他事务不能对T加任何锁,只有事务A可以读写对象T直到A释放X锁。
只有一把锁。读写操作都要给操作的数据对象加锁。可能引起级联回退。 - S锁共享锁/读锁(Share locks)
事务A对对象T加s锁,其他事务也只能对T加S,多个事务可以同时读,但不能有写操作,直到A释放S锁。 - U锁更新锁
用来预定要对此对象施加X锁,它允许其他事务读,但不允许再施加U锁或X锁;当被读取的对象将要被更新时,则升级为X锁,主要是用来防止死锁的。因为使用共享锁时,修改数据的操作分为两步,首先获得一个共享锁,读取数据,然后将共享锁升级为排它锁,然后再执行修改操作。这样如果同时有两个或多个事务同时对一个对象申请了共享锁,在修改数据的时候,这些事务都要将共享锁升级为排它锁。这些事务都不会释放共享锁而是一直等待对方释放,这样就造成了死锁。如果一个数据在修改前直接申请更新锁,在数据修改的时候再升级为排它锁,就可以避免死锁。 - 两阶段加锁协议(2PL)
一个事务其加锁都在锁释放之前。开始解锁后不能对任何数据加锁,此类事务是合式事务。合式/两阶段事务任何调度都可串行化 - (S,X)加锁协议
S锁share读锁,X锁exclusive排他锁写锁。S锁和S锁相容,提高并发性。但可能出现活锁现象(很多方等待数据对象释放,可以自行解决,死锁是循环等待),避免活锁协议补丁:先来先服务。 - (S,U,X)协议
U锁更新锁,加U锁后仍然可以加S锁,U锁升级为X锁后才不允许并发读 - 多粒度加锁协议
表锁页锁行锁。显式加锁(自己加锁),隐式加锁(祖先加锁) - 死锁处理方法
①防止死锁:时间戳,越早优先级越高。等待死亡策略(优先级高则等待,否则回退并用以前的Ts),击伤等待策略(优先级高则令对方回退并用以前的Ts,否则等待)
②检测:①超时法检测,超过人为确定超时时间则回退②等待图法,加锁加边,有回路则死锁。
③处理:回退事务、打破循环等待、解除死锁
关系数据库设计理论
可能存在的异常
- 插入异常
插不进去
插入了一个却需要插入多个 - 删除异常
删除更多信息
删除更多元组 - 更新异常
只用修改一个元组却要求修改多个 - 冗余
信息在关系中存储多次
若存在冗余异常则一定存在更新异常
数据依赖的种类
- 函数依赖
列与列之间 - 多值依赖
列与列之间 - 联结依赖
表与表之间
函数依赖
- 定义:一个或一组属性决定其他属性的值
关系模式R的所有关系实例都需要满足的条件 - 函数依赖与ER联系的关系
1:1 X→Y和Y→X
1:n Y→X
n:n 不存在函数依赖 - 函数依赖的分类
①平凡函数依赖:Y属于X
②非平凡函数依赖:Y不属于X
③完全函数依赖:X→Y但X的任何真子集都不成立,X-f->Y
④部分函数依赖:X-p->Y,只有在多个决定子的情况下出现
⑤传递函数依赖:X→Y且Y→Z,但Y→X不成立
关系模式的范式
- 第一范式
关系模式必须满足的最低要求,即每个属性都是单值属性。第一范式仍然存在四种异常 - 第二范式
关系模式是1NF,且每个非键属性都完全依赖于R的键。即需要将m:n拆开。仍然存在四种异常。方法:去掉部分函数依赖 - 第三范式
关系模式是2NF,每个非键属性都不传递依赖于R的任何候选键。即需要将1:n拆开。仍然存在异常,因为存在主属性部分函数依赖或者传递函数依赖于键的情况。方法:去掉传递函数依赖。 - BCNF范式
关系模式是1NF,且对每个函数依赖X→Y,X必须为候选键。通过消除主属性对键的部分和传递函数依赖来完成。由于可能存在多值依赖,则有异常。
已经达到了最高的规范化程度(但不是最完美的)
①所有非键属性都完全函数依赖于每个候选键。②所有键属性都完全函数依赖于每个不包含它的候选键。③没有任何属性完全函数依赖于非键的任何一组属性。 - 多值依赖与第四范式
- 联结依赖与第五范式
数据库相关代码
为了避免重复查阅,这里列出可能经常用到的代码
//展示
SHOW DATABASES
CREATE DATABASE db_name
USE db_name
DROP DATABASE db_name
CREATE TABLE (IF NOT EXISTS) table_name(id VARCHAR(10) UNSIGNED NOT NULL)
//SQL Server支持的完整性约束
CREATE DEFAULT 默认名 AS '默认值' ; SP_bindefault ‘默认名’ ,‘表名.列名’
CREATE RULE 规则名 AS @state IN/LIKE ('……') ; SP_bindrule ‘规则名’ ,‘表名.列名’
CONSTRAINT 检查约束名 CHECK(属性 IN/LIKE)
CONSTRAINT name PRIMARY KEY NONCLUSTERED (……)
id char(6) UNIQUE,或 CONSTRAINT name UNIQUE CLUSTERED
CONSTRAINT name REFERENCE 表名(列名) ON DELETE ?, ON UPDATE ?
CREATE TRIGGER 触发器名
ON 表名
FOR/AFTER/INSTEAD OF INSERT/UPDATE/DELETE
AS
SQL
RETURN
//视图及其操作
CREATE VIEW 视图名 AS SELECT name FROM tablename
INSERT INTO viewname VALUES …
数据定义子语言DDL
create、drop、alter
-
定义视图
CREATE/ALTER VIEW 视图名
AS
SQL
WITH CHECK OPTION -
定义索引
CREATE CLUSTERED/NONCLUSTERED INDEX 索引名
ON 表名 (列名 ASC/DESC,…)
数据查询
- 查询代码
SELECT 查询列表 AS ‘新名’ -- SELECT ALL/DISTINCT:DISTINCT去掉重复结果
[INTO 新表名]
FROM 源表
WHERE
GROUP BY -- GROUP BY和HAVING连在一起使用
HAVING
ORDER BY 排序表达式 ASC/DESC
COMPUTE {} -- COMPUTE汇总
- UNION查询
select语句 union all select语句,将多个查询结果合并为一个结果返回
T-SQL
- 局部变量
DECLARE @name int,…
SELECT @s=price FROM title WHERE…
查看变量:select @name - 游标(数据的行指针)
步骤:定义、打开OPEN、存取游标数据(FETCH 游标名 into 局部变量表)、关闭、释放DEALLOCATE
DECLARE 游标名 CURESOR
FOR SELECT
(FOR READ ONLY/UPDATE) -- 只读游标或者更新游标
OPEN name -- 打开游标
FETCH 游标名 INTO @局部变量列表, … -- 执行一次FETCH操作,指针下移一行
while @@fetch_status=0 -- 全局变量-1表示失败或者超出结果集范围
begin
if fetch_status<>0 begin end
else
end
CLOSE 游标名
DEALLOCATE 游标名 -- 释放游标,则不能再打开
- 存储过程:存储过程一旦被调用执行过一次,以后的调用执行所花时间与所需处理步骤更少
//定义
CREATE PROC 过程名(PROC在前面)
(@name1 int,…,@namen int OUTPUT)
AS
SQL
RETURN 存储过程执行状态值
//调用
DECLARE 返回值、状态值
EXEC @name1=name,…@namen=namen OUTPUT
参考资料
数据库(MySQL)面经汇总.
关系型数据库和非关系型数据库的区别.
MyISAM与InnoDB 的区别(9个不同点).