记录一篇很好的文章https://www.cnblogs.com/scarecrow-ryan/p/9204821.html
A C I D : \red{ACID:} ACID:
原
子
性
:
\orange{原子性:}
原子性:
事务是不可分割的工作单位,要么都发生、要么不发生。
一
致
性
:
\orange{一致性:}
一致性:
保持数据完整,即前后数据逻辑一样,不能凭空增多或减少。
隔
离
性
:
\orange{隔离性:}
隔离性:
针对多个用户同时操作,排除其他事务对本次事务对影响。
持
久
性
:
\orange{持久性:}
持久性:
一旦提交就是永久性的。
视 图 \red{视图} 视图:
视图是虚拟的表、不包含任何数据。
使用视图可以保护数据,简化检索。
视图创建后,可以使用与表相同的方式利用它们。
视 图 不 能 被 索 引 , 也 不 能 有 关 联 的 触 发 器 \orange{视图不能被索引,也不能有关联的触发器} 视图不能被索引,也不能有关联的触发器
d
r
o
p
:
\red{drop:}
drop: 直接删除表
d
e
l
e
t
e
:
\red{delete:}
delete: 删除特定数据
t
r
u
n
c
a
t
e
:
\red{truncate:}
truncate: 删除表所有数据,保留表结构
索 引 : \red{索引:} 索引:
排序数据结构,协助快速查询、更新数据库表。B+树实现。
但是构建索引需要额外空间消耗,所以数据量太大不太适应索引。
同时索引需要额外耗时。
索引一般采用外键上,加快链接的速度。
当修改远远大于检索时,不适用索引。
唯 一 索 引 : \orange{唯一索引:} 唯一索引:
不允许两个任意行具有相同索引值。
数据库自动为主键创建主键索引,主键索引是一种唯一索引。
多 列 索 引 : \orange{多列索引:} 多列索引:
select * from test where A = 1 and B = 2
多列索引是通过合并多列值成新值再排序的索引,有先后顺序,通常把严格的列放在前面,比如index(A,B)
sql会先筛选A符合条件的数据,在基础上筛选B符合条件的纪录。
如果分别建立索引,则sql只会选择最严格的索引来检索。
连 接 \red{连接} 连接
tableA
id name
1 lee
2 zhang
4 wang
tableB
id name
1 190
2 2100
3 70
左 链 接 : l e f t j o i n \orange{左链接:left join} 左链接:leftjoin
select * from tableA left join tableB on tableA.id = tableB.id
1 lee 190
2 zhang 2100
4 wang NULL
右 链 接 : r i g h t j o i n \orange{右链接:right join} 右链接:rightjoin
select * from tableA right join tableB on tableA.id = tableB.id
1 lee 190
2 zhang 2100
NULL NULL 370
完 整 外 链 接 : \orange{完整外链接:} 完整外链接:
select * from tableA full join tableB on tableA.id = tableB.id
1 lee 190
2 zhang 2100
4 wang NULL
NULL NULL 370
内 链 接 : \orange{内链接:} 内链接:
select * from tableA join tableB on tableA.id = tableB.id
1 lee 190
2 Zhang 2100
交 叉 连 接 : \orange{交叉连接:} 交叉连接:
select * from tableA cross join tableB
1 lee 190
2 zhang 190
4 wang 190
1 lee 2100
2 zhang 2100
4 wang 2100
…
不需要对齐,就是N*M枚举
范 式 \red{范式} 范式
依
赖
:
\blue{依赖:}
依赖:
一对一关系:则X->Y,Y->X,例如学校->校长
一对多关系:则X->Y,例如姓名和年龄
多对多不存在依赖。
主
属
性
,
非
主
属
性
:
\blue{主属性,非主属性:}
主属性,非主属性:
标示数据唯一的一个或多个属性称为主属性,剩下依赖主属性推导出就是非主属性。
第
一
范
式
\orange{第一范式}
第一范式
不满足第一范式的数据库就不是关系数据库。
关
系
模
式
R
,
每
一
个
关
系
r
都
是
原
子
项
\blue{关系模式R,每一个关系r都是原子项}
关系模式R,每一个关系r都是原子项
通俗点就是没有重复的列
第
二
范
式
\orange{第二范式}
第二范式
必须先满足第一范式
每
一
个
非
主
属
性
依
赖
于
主
键
整
体
(
主
键
可
以
有
多
个
)
,
而
不
能
依
赖
部
分
主
键
\blue{每一个非主属性依赖于主键整体(主键可以有多个),而不能依赖部分主键}
每一个非主属性依赖于主键整体(主键可以有多个),而不能依赖部分主键
通俗点就是每一行必须被唯一区分,一般主键只有一个称为id。
第
三
范
式
\orange{第三范式}
第三范式
必须满足第二范式
消
除
传
递
依
赖
\blue{消除传递依赖}
消除传递依赖
第三范式消除冗余,通俗一点就是表中表,非主属性抽出来也可以成一张表。
一
般
数
据
库
只
需
满
足
第
三
范
式
即
可
\blue{一般数据库只需满足第三范式即可}
一般数据库只需满足第三范式即可
B
C
N
F
:
\orange{BCNF:}
BCNF:
必须满足第三范式
消
除
部
分
依
赖
\blue{消除部分依赖}
消除部分依赖,即AB->C,B->C,只存在AB->C或B->C
通俗点就是各候选键的子集不可以推出非主属性。
隔 离 级 别 : \red{隔离级别:} 隔离级别:
事务四种隔离级别:
脏读 | 不可重复读 | 幻读 | |
---|---|---|---|
Read uncommitted | Y | Y | Y |
Read committed | N | Y | Y |
Repeatable read | N | N | Y |
Serializable | N | N | N |
1
−
脏
读
:
\green{1-脏读:}
1−脏读:
事务A读取了事务B未提交的数据,如果事务B回滚,则发生脏读,事务A读取的是无效数据。
2
−
不
可
重
复
读
:
\green{2-不可重复读:}
2−不可重复读:
当事务A中间有事务B提交成功,则事务A之后读取的数据有可能与之前不同。针对update
3
−
幻
读
(
虚
读
)
:
\green{3-幻读(虚读):}
3−幻读(虚读):
当事务A检索到N条数据,事务B插入与N条无关的符合事务A的M条数据,则事务A再次检索就有N+M条数据。针对insert
隔 离 级 别 : \red{隔离级别:} 隔离级别:
I
S
O
L
A
T
I
O
N
_
R
E
A
D
_
U
N
C
O
M
M
I
T
T
E
D
:
\orange{ISOLATION\_READ\_UNCOMMITTED:}
ISOLATION_READ_UNCOMMITTED:-
读
未
提
交
\blue{读未提交}
读未提交
事务最低隔离级别,一个事务可以看到另一个事务未提交的数据。
I
S
O
L
A
T
I
O
N
_
R
E
A
D
_
C
O
M
M
I
T
T
E
D
:
\orange{ISOLATION\_READ\_COMMITTED:}
ISOLATION_READ_COMMITTED:-
读
提
交
\blue{读提交}
读提交
大
多
数
数
据
库
的
默
认
隔
离
级
别
\green{大多数数据库的默认隔离级别}
大多数数据库的默认隔离级别
保证一个事务提交数据后,才能被另一个事务读取。
I
S
O
L
A
T
I
O
N
_
R
E
P
E
A
T
A
B
L
E
R
E
A
D
:
\orange{ISOLATION\_REPEATABLE_READ:}
ISOLATION_REPEATABLEREAD:-
重
复
读
\blue{重复读}
重复读
m
y
s
q
l
默
认
级
别
\green{mysql默认级别}
mysql默认级别
整个事务过程中,对同一笔数据的读取结果是相同的,不管其他事务是否对数据更新。
I
S
O
L
A
T
I
O
N
_
S
E
R
I
A
L
I
Z
A
B
L
E
:
\orange{ISOLATION\_SERIALIZABLE:}
ISOLATION_SERIALIZABLE:-
序
列
化
\blue{序列化}
序列化
事务必须顺序执行。缺点是并法下降,性能变差。
表 分 页 : \red{表分页:} 表分页:
一
张
表
为
什
么
要
分
页
:
\orange{一张表为什么要分页:}
一张表为什么要分页:
如果一张表有几千万行数据时,查询一次时间会很大,如果有联合查询的话,可能就死了。
分页通过一定hash规律,将一张表划分为数个页,减小数据库负担。
表
锁
定
、
行
锁
定
:
\orange{表锁定、行锁定:}
表锁定、行锁定:
表锁定,即当锁定时,不能对表操作。
行锁定,即当该行数据锁定时,不能对该行数据操作。