数据库知识点
数据库知识点
1.数据库事务的四个特性
原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability)。
原子性:一个事务(Transaction)中的所有操作,要么全部完成,要么全部不完成,不会结束在中间某个环节。事务在执行过程中发生错误,会被回滚(Rollback)到事务开始前的状态,就像这个事务从来没有执行过一样。
一致性:在事务完成前后,数据库的完整性没有被破坏。这表示写入的资料必须完全符合所有的默认规则,这包含资料的精准度、串联新以及后续数据库可以自发性地完成预定的工作。
隔离性:当两个或者多个事务并发访问(此处访问指查询和修改的操作)数据库的同一数据时所表现出的互相关系。事务隔离分为不同的级别,包括读为提交(Read uncommitted)、读提交(Read committed)、可重复读(Repeatable read)和串行化(Serializable)。
持久性:在事务完成以后,该事务对数据库所作的更改便持久地保存在数据库之中,而且是完全的。
2.数据库设计的范式
2.1 第一范式
数据库表中,每个属性都是不可再分的(原子性)。
2.2 第二范式
消除数据表的部分依赖。
<学生,课程> => 上课教室
<学生,课程> => 教师
<学生,课程> => 教师职称
<课程> =>上课教室
<课程> =>教师
<课程> =>教师职称
以上就是部分依赖,做法就是将上课教室,教师,教师职称等于学生,课程属性拆开。
2.3 第三范式
消除传递依赖。
<课程> =>教师
<教师> =>教师职称
以上就是传递依赖,方案就是将课程 教师 教师职称 拆分成课程 教师;教师 教师职称两张表
2.4 BC范式
第三范式中,属性不依赖于其他非属性。而BC范式中,不仅属性不能依赖于其他非主属性,其他非属性也不得依赖于其他他非主属性。
3.数据库表级联操作
图中方位 | 连接方式 |
---|---|
左 | left join |
右 | right join |
中 | inner join |
下 | full outer join |
4.视图与表
定义:视图是虚拟的表,与包含数据的表不一样,视图只包含使用时动态检索数据的查询;不包含任何列或数据。使用视图可以简化复杂的sql操作,隐藏具体的细节,保护数据;视图创建后,可以使用与表相同的方式利用它们。
无法使用索引,也不能有关联的**或者默认值
5. drop,delete和truncate的区别
drop直接删掉表;而truncate清空表中数据,但不删除表结构; delete删除表中数据,可以加where字句。
(1) delete与truncate的区别:DELETE语句执行删除的过程是每次从表中删除一行,同时将该行的删除操作作为事务记录保存在日志中以便回滚。TRUNCATE TABLE 则清空表中所有数据,无日志,删除不能恢复。在删除的过程中不会**与表有关的删除触发器。执行速度快。
(2) 表和索引所占空间:TRUNCATE会使表和索引空间恢复到初始大小,DELETE操作不会减少表或索引所占用的空间;drop语句将表所占用的空间全释放掉。
(3) 应用范围:TRUNCATE 只能对TABLE;DELETE可以是table和view
(4) TRUNCATE 和DELETE只删除数据,而DROP则删除整个表(结构和数据)。
(5) truncate与不带where的delete :只删除数据,而不删除表的结构(定义)drop语句将删除表的结构被依赖的约束(constrain),触发器(trigger)索引(index);依赖于该表的存储过程/函数将被保留,但其状态会变为:invalid。
(6) delete语句为DML(data maintain Language),这个操作会被放到 rollback segment中,事务提交后才生效。如果有相应的 trigger,执行的时候将被触发。
(7) truncate、drop是DLL(data define language),操作立即生效,原数据不放到 rollback segment中,不能回滚
(8) Truncate table 表名 速度快,而且效率高,因为:
truncate table 在功能上与不带 WHERE 子句的 DELETE 语句相同:二者均删除表中的全部行。但 TRUNCATE TABLE 比 DELETE 速度快,且使用的系统和事务日志资源少。DELETE 语句每次删除一行,并在事务日志中为所删除的每行记录一项。TRUNCATE TABLE 通过释放存储表数据所用的数据页来删除数据,并且只在事务日志中记录页的释放。
(9) TRUNCATE TABLE 删除表中的所有行,但表结构及其列、约束、索引等保持不变。新行标识所用的计数值重置为该列的种子。如果想保留标识计数值,请改用 DELETE。如果要删除表定义及其数据,请使用 DROP TABLE 语句。
(10) 对于由 FOREIGN KEY 约束引用的表,不能使用 TRUNCATE TABLE,而应使用不带 WHERE 子句的 DELETE 语句。由于 TRUNCATE TABLE 不记录在日志中,所以它不能**触发器。
6.数据库中的索引原理
数据库索引,是数据库管理系统中一个排序的数据结构,以协助快速查询、更新数据库表中数据。索引的实现通常使用B树及其变种B+树。
6.1 建立索引的优点
(1)通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性。
(2)可以大大加快数据的检索速度,这也是创建索引的最主要的原因。
(3)可以加速表和表之间的连接,特别是在实现数据的参考完整性方面特别有意义。
(4)在使用分组和排序子句进行数据检索时,同样可以显著减少查询中分组和排序的时间。
(5),通过使用索引,可以在查询的过程中,使用优化隐藏器,提高系统的性能。
6.2 建立索引的缺点
(1)创建索引和维护索引要耗费时间,这种时间随着数据量的增加而增加。
(2)索引需要占物理空间,除了数据表占数据空间之外,每一个索引还要占一定的物理空间,如果要建立聚簇索引,那么需要的空间就会更大。
(3)当对表中的数据进行增加、删除和修改的时候,索引也要动态的维护,这样就降低了数据的维护速度。
6.3 何种情况建立索引
需要建立索引的情况 | 不适合建立索引的情况 |
---|---|
经常需要检索的列 | 极少使用或者参考的列 |
主键的列 | 极少数据值的列 |
用在连接的列 | 定义为text,image和比他数据类型的列 |
需要范围检索的列 | 当修改性能远远大于检索性能 |
在经常需要排序的列 | |
在where子句中涉及的列 |
6.4 索引的种类
索引分为唯一索引、主键索引和聚集索引
6.5 数据库的隔离级别
1 脏读:修改时加排他锁,直到事务提交后才释放,读取时加共享锁
2 不可重复读:读取数据时加共享锁,写数据时加排他锁,都是事务提交才释放锁。读取时候不允许其他事物修改该数据,不管数据在事务过程中读取多少次,数据都是一致的,避免了不可重复读问题。
3 幻读问题:采用的是范围锁RangeS RangeS_S模式,锁定检索范围为只读,这样就避免了幻影读问题,在这里有个描述范围锁的文章
read uncommitted
read committed
repeated read
Serializable
Oracle默认使用read committed ,MySQL默认repeated read