三大范式
- 字段都是不可拆分的原子值(要求数据库获取的数据是可以直接使用的数据)
- 必须完全依赖主键(不允许联合主键)
- 除主键列的其他列之间不能有传递依赖
事务的四大特征
- 原子性:事务是最小的执行单位,不可在分割
- 一致性:sql 语境必须保证同时成功或失败
- 隔离性:事务1和事务2之间是具有隔离的
- 持久性:事务结束,就不可回退
隔离性即产生的问题
- 读未提交(read uncommitted):一个事务还没有提交时,它做的变更就能被别的事务看到。
- 产生问题:如个事务1执行失败,那么事务2可能在执行过程中用到了事务1执行过程中改变的一些数据。导致事务1虽然执行失败,但是事务1产生的数据被执行成功的事务2用到,形成脏数据。
- 读提交(read committed):一个事物提交之后,它做的变更才会被其他事务看到。
- 产生问题:事务1在执行过程中,事务2修改数据并提交了事务1用到的其中一个数据,导致事务2最终的对数据的计算修改,是事务2改变后的数据。
- 可重复读(repeatable read):一个事物执行过程中看到的数据,总是跟这个事务在启动时看到的数据是一致的。未提交变更对其他事务也是不可见的。
- 产生问题:两个事务同时修改一张表,那么在事务结束前无法查看到另一事务对表的修改。在插入数据的时候,唯一约束可能会产生错误。
- 串行化(serializable):对于同一行记录,写会加“写锁”,读会加“读锁”,当出现锁冲突时,后访问的事务需要等前一个事务执行完成,才能继续执行。
SQL语句优化注意事项
- 避免使用in、not in,、可以使用 between
select id from table where num in(1,2,3)
select id from table where num between 1 and 3
- 子查询尽量使用 exists
select num from table where num
exists(select * from table where b.num = a.num)
- 避免使用or 使用union
select id from a where num = 10
union all
select id from a where num=20
- 避免null 值判断 给字段添加默认值0
select * from table t where d = '0';
- 避免在where条件中等号的左侧进行函数操作,将函数操作移动到右侧
select * from table t where d = t.a+t.c ;
- 使用JOIN时,应该用小结果集驱动大结果集。
select * from a join b on a.id = b.id
left join c on c.time = a.date
left join d on c.pid = b.aid
left join e on e.cid = a.did
- 避免左模糊查询,使用右模糊
select id from a where name like 'abc%';
优先博主推荐
https://www.cnblogs.com/pepcod/archive/2013/01/01/2913496.html
小米SQL优化工具学习
https://baijiahao.baidu.com/s?id=1669361873159516799&wfr=spider&for=pc