数据库要点
- 数据库:长期存在于计算机的,有组织的,可共享的,结构化的,相关的,大量的数据集合。
- 数据库管理系统:建立在操作系统之上的软件系统,负责管理和维护和数据库中的数据,同时给用户提供访问方法的接口
- 数据库设计三个阶段的目标和任务:
- 概念设计:
目标:将需求分析得到的用户需求抽象为概念模型,挖掘需求分析中的二义性及隐含需求
任务:采用ER模型表示概念模型 - 逻辑设计:
目标:将概念模型转化为目标数据库管理系统所支持的数据模型
任务:将ER模型转换为关系模型 - 物理设计:
目标:为所涉及的数据库选择合适的物理结构(存储结构和存取方法等)
任务:根据逻辑数据模型,针对具体的DBMS进行物理结构的设计
- 关系模型的三种管理约束
- 实体完整性:主码不能为空
- 参照完整性:外码的取值:①为空 ②所参照的候选码的值
- 用户定义的完整性:由用户或数据库管理员定义的规则
- 超码是在一个关系中唯一标识一行元组的属性集合;候选码是在一个关系中唯一标识一行元组的最小属性集合,不是唯一的;主码是候选码中的一个(根据主码来建立唯一索引);候选码中未被选中为主码的称为备选码。
- 范式
范式:符合某一种级别的关系模式的集合
规范化:一个低一级范式的关系模式通过模式分解可以转换成若干个高一级范式的关系模式
函数依赖:对于X中的每一个取值,Y中有唯一值与之对应
主属性:位于候选码中的属性
1NF:关系模式中属性不可分
2NF:不能存在非主属性对码的部分依赖
3NF:关系模式中不能存在非主属性对码的传递依赖 - 事务
事务就是被绑定在一起作为一个单元的一组SQL语句,完成用户的一系列操作。
事务具有ACID特性:
- Atomicity:一个事务中的操作要么都执行,要么都不执行。
- Consistency:事务应当保持完整性约束的条件,始终处于一致的状态,保证正确性。
- Isolation:事务的执行不受到其它并发事务的影响
- Durability:事务一旦提交成功,该事务对数据库做的更改就会持久保存在数据中。
- 调度:多个事务交叉执行的序列
冲突操作:不同的事物对同一个数据的读写操作和写写操作
可串行化调度:并发调度的结果与某个串行调度的结果相同,则该并行调度结果正确
冲突可串行化调度:调度S可以通过交换非冲突(只有读读不冲突)操作变成某一串行调度 -
两段锁协议(2PL)是冲突可串行化的充分不必要条件
2PL:锁分为增长段和收缩段,只有在不需要更多锁时才释放锁。
image.png -
严格两段锁:在事务提交时在释放锁
严格两段锁:主要解决事务回滚问题,也可保证调度是可恢复的。
可恢复调度:一个事务读取了另一个事务尚未提交的数据,这个事务一定要在那个事务提交之后提交。
image.png - 隔离等级
read uncommitted:可读取别人尚未提交的数据
read committed:只能读取别人已提交的数据
repeatable read:多次读取的结果一定一样,事务执行时间为0
serializable:串行化
事实上,postgresql只提供两种事务的隔离级别,read committed 和 serializable。
- 脏读(dirty read)
一个事务读取了另一个未提交的并行事务写的数据 - 不可重复读(non-repeatable read)
一个事务重新读取前面读取过的数据,发现该数据已经被另一个已提交的事务修改过。即原始读取不可重复 -
幻读(phantom read)
第一个事务对表中的数据进行了修改,这种修改涉及到表中的全部数据行。 同时,第二个事务也修改这个表中的数据,这种修改是向表中插入一行新数据。那么,以后就会发生操作第一个事务的用户发现表中还具有没有修改的数据行,就好像发生了幻觉一样
image.png
- 索引
减少访问磁盘的次数:定义一种叫索引的逻辑结构
两种索引方式:(逻辑结构)
- Hash:被索引属性的值是唯一的,如候选码,主码
有一个索引表,记录索引值和块地址,和主表一行行对应
默认主码会被建立索引 - B/B+树:可以做到查找和增删改的平衡,叶子节点不满
数据基本稳定(用户插入较少)时建立,否则不断插入会退化为线性,一段时间后还需要rebuild
簇索引(物理结构)
对于某个关系簇索引只能建一个,但是逻辑索引可以建立多个。
索引的优点是提高了查询效率,缺点是减慢了数据录入的速度,也增加了数据库存储空间的大小。
DBMS现在已做到基于规则的语法优化和基于统计的优化。
- ER模型的陷阱
-
扇形陷阱:同一实体有两个或多个1对n关系扇出
image.png
image.png
解决方法:
image.png -
深坑陷阱:两个相关联的实体的均为部分参与
image.png
image.png
解决方法:
image.png
- 内连接和外连接的区别
内连接仅连接两个表中匹配的行,而外连接包含一个表中的所有行和另一个表中匹配的行。 - 什么是存储过程?
存储过程是一个预编译的SQL语句,是为了完成某个数据库中的特定功能而编写的语句集,该语句集包括SQL语句,条件语句和循环语句。优点是允许模块化的设计,比如只创建一次,以后在该程序中就可以多次调用。如果某次操作需要多次执行SQL,使用存储过程比单纯SQL语句要快。 - 触发器的作用?
触发器是一种特殊的存储过程,不由用户调用,而是通过事件触发而被执行。它可以维护数据的完整性和一致性,跟踪数据库内的操作从而不允许未经许可的更新和变化。可以级联,比如某表上的触发器包含对另一个表的数据操作,则该操作又会导致该表触发器被触发。 - 什么是视图?
视图是一种虚拟的表,即视图所对应的数据不进行实际存储,数据库中只有视图的定义。具有和基本表相同的功能。可以对视图进行增删改查操作,视图通常是一个表或者多个表的行或列的子集。
要通过视图更新基本表中的数据,则必须保证视图是可更新视图。对于可更新视图,视图中行和基表中的行之间必须具有一对一关系。有一些包含聚合等的结构就会使得视图不可更新。 - 如何优化数据库,提高数据库性能?
- 给数据库建立合理的索引
- 适当情况下尽可能使用存储过程而不是SQL查询,前者经过了预编译,运行速度更快
- 优化查询语句
- union和union all的区别
主要在于对重复结果的处理,union在进行表连接后会筛选掉重复的记录,而union all只是简单的将两个结果合并后返回,可能会包含重复的数据。
materialized aggregates:
物化聚合就是提前算,把运算结果存在一个表中。而视图还是执行SQL语句。缺乏了实时性,但很多时候并不在意。
DDL:数据定义语言,主要的命令有CREATE、ALTER、DROP等,大多在建立表时使用。
DML:数据操作语言,主要命令有SELECT,DELETE,UPDATE,INSERT,用来对数据库中的数据进行操作。
delete,truncate,drop比较:
truncate是清空一个表的内容
delete是dml操作,truncate是ddl操作,ddl操作回滚很麻烦,甚至无法进行。因此,用delete删除整个表的数据时,会产生大量的roolback,占用很多的rollback segments, 而truncate不会。
在内存中,用delete删除数据,表空间中其被删除数据的表占用的空间还在。
而用truncate清除数据,内存中表空间中其被删除数据的表占用的空间会被立即释放,不能被恢复。
truncate和delete只删除数据,而drop则删除整个表(结构和数据)
建立复合索引(c1,c2)顺序很重要 where c1会用到该索引,where c2则不会用到该索引
数据量很少时数据库是不会用索引的
分区,负载均衡:分区指向不同的硬盘,表空间,