三范式的好处:数据不会有冗余,更新操作只需要单表操作
第一范式(1NF):列是原子的,不能再拆分成其他几列
第二范式 (2NF):必须有一个主键,包含在主键中列必须完全依赖于主键,不能只依赖于主键的一部分。
第三范式 (3NF): 非主键列必须直接依赖于主键,不能存在传递依赖。即不能存在:非主键列 A 依赖于非主键列 B,非主键列 B 依赖于主键的情况
事务(ACID):一组操作,要么都执行,要么都不执行。
原子性,一致性,隔离性,持久性
InnoDB事务实现原理:
Redo log(重做日志) 保证 持久性
Undo log(回滚日志)保证 原子性
锁机制,MVCC 等保证 隔离性
MVCC: 多版本并发控制,实际上就是保存了数据在某个时间节点的快照
锁的类型:共享锁和排他锁,也叫做读锁和写锁
读锁是共享的,可以通过lock in share mode实现,这时候只能读不能写。
写锁是排他的,它会阻塞其他的写锁和读锁。从颗粒度来区分,可以分为表锁和行锁两种。
InnoDB:支持事务,表级锁 + 行级锁,支持外键
MyISAM:不支持事务,表级锁,不支持外键
并发事务带来的问题:脏读,丢失修改,不可重复读,幻读
不可重复读和幻读的区别:不可重复读是多次读取一条记录值被修改,幻读是多次读取一条记录发现记录增多或减少了
事务隔离级别:
读取未提交:READ-UNCOMMITTED
读取已提交: READ-COMMITTED
可重复读: REPEATABLE-READ
可串行化:SERIALIZABLE
聚集索引(主键):索引结构和数据一起存放
非聚集索引(二级索引):索引结构和数据分开存放(可能回表)
覆盖索引 : 即需要查询的字段正好是索引的字段,那么直接根据该索引,就可以查到数据了, 而无需回表查询。