MySQL知识点
事务
ACID原则
原子性:要么全部成功,要么全部失败
隔离性:各个进程互不干扰
一致性:总数不变
持久性:一旦提交,数据就到数据库,并且不可逆转
事物隔离性问题
脏读:一个事务读取到另外一个事务未提交的数据
幻读(虚读):在一个事务内,读到了别人插入的数据,导致读前读后数据不一致
不可重复读:在同一个事务内,重复读取到表的数据,判断不出哪个是要的数据,不可重复读是指一个事务内多次根据同一查询条件查询出来的同一行记录的值不一致,举例:公司给你发工资条,你第一次查看是一万块,然后财务发现忘了扣税,把你工资条改了。你再看,就只有九千多了。税扣掉了。这就是不可重复读。
避免不可重复读的方法:对于处于读取状态的行,数据库对该行进行加锁,避免其他事物对该行进行修改。
MYSQL数据库隔离级别
MySQL 有四个隔离级别
- READ-UNCOMMITTED(读取未提交): 最低的隔离级别,允许读取尚未提交的数据变更,可能会导致脏读、幻读或不可重复读。
- READ-COMMITTED(读取已提交): 允许读取并发事务已经提交的数据,可以阻止脏读,但是幻读或不可重复读仍有可能发生。
- REPEATABLE-READ(可重复读): 对同一字段的多次读取结果都是一致的,除非数据是被本身事务自己所修改,可以阻止脏读和不可重复读,但幻读仍有可能发生。
- SERIALIZABLE(可串行化): 最高的隔离级别,完全服从 ACID 的隔离级别。所有的事务依次逐个执行,这样事务之间就完全不可能产生干扰,也就是说,该级别可以防止脏读、不可重复读以及幻读。
默认支持的隔离级别是 REPEATABLE-READ(可重读)
增删改需要提交事务
索引
唯一索引:
唯一索引不止用于提升查询性能,还用于保证数据完整性。唯一索引不允许向表中插入任何重复值。其基本语法如下所示:
CREATE UNIQUE INDEX index_name
on table_name (column_name);
优化:
使用逻辑外键代替物理外键
给每个字段定义容量,避免资源占用
如果有大量增删改则不适用索引,如果是大量数据查找则用索引方便
创建中间表,负责统计粉丝量等
数据库规范
第一范式(1NF)
原子性:保证每一列不可再分
第二范式(2NF)
前提:满足第一范式
每张表只描述一件事情
第三范式(3NF)
前提:满足第一范式和第二范式
第三范式需要确保数据表中的每一列数据都和主键直接相关,而不能间接相关。