三大范式:
- 每列保持原子性,不可拆分
- 每列都和主键有关,而不能只与主键的某一部分相关(主要针对联合主键而言)
- 每列都和主键直接相关,而不是间接相关
数据库引擎 InnoDB 和 MyISAM 的区别
- 事务处理:MyISAM 注重性能,执行速度比 InnoDB 快,但是不支持事务处理(也
没有外键)。 - 物理构成:每个 MyISAM 在磁盘上存储成三个文件,.frm 表定义,.MYD 数据文件,
.MYI 索引文件。InnoDB 只有数据文件和日志文件,InnoDB 表的大小只受限于操作
系统文件的大小。 - 增删改查:如果执行大量的 SELECT,MyISAM 是更好的选择。而如果执行大量的
INSERT 或 UPDATE,InnoDB 表在性能上更加出色。DELETE 时 InnoDB 不会重新建
立表,而是一行一行的删除。InnoDB 不支持外部导入数据(load table)。 - 自增:对于设置为自增的字段,InnoDB 中必须包含只有该字段的索引,但是在
MyISAM 表中,可以和其他字段一起建立联合索引。 - 行数:MyISAM 会记录表的行数,所以在 select count(*) from table,MyISAM 只要
简单的读出之前保存好的行数即可,InnoDB 不保存,需要扫描一遍整个表来计算有
几行。当然,有 where 子句的时,2 种表的操作时一样的。 - 锁:MyISAM 只支持表级锁,不支持行级锁。
四种锁机制
- 共享锁(S 锁),事务对数据对象加 S 锁之后,其他事务就只能读取这个对象,无法对这个对象做任何修改。
- 排它锁(X 锁),事务对数据对象加 X 锁之后,其他事务无法读取或操作这个对象。
- 悲观锁:锁住读取的记录,防止其它事务读取和更新这些记录。其它事务会一直阻塞,直到这个事务结束。
- 乐观锁:不会锁住任何东西,但有可能会造成脏数据被更新到数据库中
事务四大特性
- 原子性(业务操作单元)
- 一致性(ATM 取钱)
- 隔离性(二元世界)
- 持久性(不可逆操作)
脏读、不可重复读与幻读
- 脏读:当一个事务正在访问数据,并且对数据进行了修改,而这种修改还没有提交到数据库中,这时,另外一个事务也访问这个数据,然后使用了这个数据
- 不可重复读:在一个事务内,多次读同一数据,并且在 2 次读取之间另外一个事务修改了这个数据,那么就导致在一个事务内两次读到的数据是不一样的
- 幻读:这是一种当事务不是独立执行时会发生的现象。例如:一个事务对一个表中的所有数据进行了修改,同时另外一个事务向表中插入了一条数据。那么操作第一个事务的用户发现表中还有没有修改的数据行,就好象发生了幻觉一样
事务隔离级别 | 脏读 | 不可重复读 | 幻读 |
---|---|---|---|
Read Uncommitted | y | y | y |
Read Committed | n | y | y |
Repeatable Read(悲观锁级别) | n | n | y |
Serializable | n | n | n |
视图的特点与应用场景
一般用于控制权限的地方,或者用于查询的某些地方,特点如下:
- 视点集中
使用户只关心它感兴趣的某些特定数据和他们所负责的特定任务,同样提高了数据的安全性。 - 简化操作
向用户隐藏了表与表之间的复杂的连接操作,不必重新写这些复杂的查询语句,只要一条简单的查询视图语句即可。 - 定制数据
- 合并分割数据
- 安全性
GUID 和 Int 作为主键谁更合适?
- guid16B,int4B,int 占用存储空间小
- guid 是独一无二基本不会重复,int 数据合并时会出现主键重复的情况
- int 有内置函数获取最新的值,如 Scope_Indentity,guid 没有这样的方法
- int 容易记忆,join 操作性能更好
- guid 做主键索引时会降低性能
- 如果项目存在数据迁移的情况,使用 guid,不然使用 int
varchar 和 varchar2 有什么区别?
- varchar2 把所有字符都占两字节处理(一般情况下),varchar 只对汉字和全角等字符占两字节,数字,英文字符等都是一个字节;
- VARCHAR2 把空串等同于 null 处理,而 varchar 仍按照空串处理;
- VARCHAR2 字符要用几个字节存储,要看数据库使用的字符集,
大部分情况下建议使用 varchar2 类型,可以保证更好的兼容性。
truncate drop delete 区别
- truncate drop 是数据定义语言(DDL),执行后会自动提交,delete 语句可以回滚。
- truncate 和 delete 只删除数据,不删除表结构。执行 drop 操作后,将删除表结构和依赖于此表的约束、触发器、索引
- 速度上,drop>truncate>delete
- 一般来说删除数据用 delete,删除表用 drop,删除所有数据但保留表结构用 truncate。
truncate table 与不带 where 子句的 delete 的区别
他们功能相同,但是 truncate 更快,truncate 之后计数值重置,truncate 不会激活触发器,如果表有视图,无法用 truncate 删除
4 种语言类型:
-
DDL:Data Definition Language,数据库模式定义语言
关键字:create,truncate,drop,alter -
DML:Data Manipulation Language,数据操纵语言
关键字:update、insert、delete -
DCL:Data Control Language,数据控制语言
关键字:grant、revoke、commit、rollback -
DQL:Data Query Language,数据查询语言
关键字:select
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于