SQL
连接查询与子查询的比较
1. 连接查询的优点是可以用尽可能少的SQL进行查询,简化了应用和数据库之间的IO调用;缺点是如果表设计不好,会造成数据库大量的内部IO操作,特别是大量没必要的全表扫描。
使用场景:要么是确实要读取的数据量非常大,要么是能够通过索引等方式控制住全表扫描的数量
2. 子查询的缺点是应用和数据库之间的IO调用比较多,损耗了数据库的带宽;优点是对原来的被驱动表来说数据是明确的,可以通过大量的索引,特别是主键索引避免全表扫描
drop、delete、truncate比较
- 区别
-
delete和truncate只删除表的数据不删除表结构
-
速度:drop>truncate>delete
-
delete语句是dml,这个操作放到rollback segement中,事务提交之后才生效
-
delete如果有相应的触发器,执行的时候将被触发。truncate,drop是ddl,操作立即生效,原数据不放到rollback segment中,不能回滚,操作不触发触发器。
-
- 使用场景:
-
不再需要一张表时候,用drop
-
想删除部分数据行,用delete带上where子句
-
保留表而删除所有数据时候用truncate
-
DML和DDL的含义
1. DML(Data Manipulation Language) 数据操作语言,数据库基本操作,如(CRUD)
2. DDL(Data Manipulation Language) 数据定义语言,用于定义和管理SQL数据库中的所有对象的语言
DML与DDL的区别
1. DML操作是可以手动控制事务的开启、提交和回滚的
2. DDL操作是隐性提交的,不能roolback
视图的作用,何时能更新视图
1. 视图可以定制用户数据,聚焦特定的数据
2. 视图可以简化数据操作
3. 使用视图,基表中的数据就有了一定的安全性
4. 可以合并分离的数据,创建分区视图
一般基本基表更新了,视图也会跟着更新
系统原理
ACID的作用以及实现原理
A 原子性(Atomicity)
事务必须被视为不可分割的最小工作单元,整个事务的所有操作要么全部提交成功,要么全部失败回滚。
回滚可以用回滚日志(Undo Log)来实现,回滚日志记录着事务所执行的修改操作,在回滚时反向执行这些修改操作即可。
B 一致性(Consistency)
数据库在事务执行前后都保持一致性状态。在一致性状态下,所有事务对同一个数据的读取结果都是相同的。
C 隔离性(Isolation)
一个事务所做的修改在最终提交以前,对其它事务是不可见的。
D 持久性(Durability)
一旦事务提交,则其所做的修改将会永远保存到数据库中。即使系统发生崩溃,事务执行的结果也不会丢失。
系统发生奔溃可以用重做日志(Redo Log)进行恢复,从而实现持久性。与回滚日志记录数据的逻辑修改不同,重做日志记录的是数据页的物理修改
四大隔离级别
READ UNCOMMITTED(未提交读)
事务中的修改,即使没有提交,对其他事务也都是可见的。(脏读)
READ COMMITED(提交读)
一个事务从开始直到提交之前,所做的任何修改对其他事务都是不可见的。(不可重复读)
REPEATABLE READ(可重复读)
该级别保证了在同一个事务中多次读取同样的记录的结果是一致的。(幻读)
SERIALIZABLE(可串行化)
通过强制事务串行执行,会在读取的每一行数据上都加锁,导致大量的超时和锁争用的问题
不可重复读和幻影读
不可重复读:两次执行同样的查询,可能得到不一样的结果。
如:T2 读取一个数据,T1 对该数据做了修改。如果 T2 再次读取这个数据,此时读取的结果和第一次读取的结果不同。
幻影读:当某个事务在读取某个范围内的记录时,另外一个事务又在该范围内插入了新的记录,当之前的事务再次读取该范围的记录时,会产生幻行
如:T1 读取某个范围的数据,T2 在这个范围内插入新的数据,T1 再次读取这个范围的数据,此时读取的结果和和第一次读取的结果不同