update 执行过程
事务提交2个阶段如何保证一致性;或者说是如何恢复的?
crash 重启后:
- 代开redo log 和系统表空间文件IbdataN
- 找到最新Checkpoint ,扫描redo log 即处于prepare 状态的redo log
- 如果在bin log 存在记录,则commit ,否则rollback事务;
事务隔离级别:
- read uncommited = ru ;B session 未提交,A可以读到;赃读
- read commited = rc ;B session 提交后,A可以读到;
- repeatable read= rr ;B session 提交,不影响A 的数据;但可能幻读(增删)
- serializable 串行 ;不存在:赃读、不可重复读、幻读问题;效率最低
索引相关
索引设计原则:
- where group order,关联查询 列可以添加索引;
- 索引要适当,否则影响cud 性能;
- 在区分度高的字段建索引,否则没有效果,即过度索引;
- 唯一索引比不同索引性能要高;
- 字段尽量不要null,否则可能全表扫描;
- 多列索引:最左原则,注意使用顺序,尽量区分度高的放在左边
- 避免隐式转换;
- where 中避免使用函数;
- 明确select 的字段;
- 禁止负向查询,not in, !=,<>,!<,!>,not like
- 缩小结果集,再join;
- like %xx 匹配,无法使用索引;
- or 导致索引失效;
- 串列需要前缀索引,提高查询速度;
联合索引及其使用:
- 最左原则;注意索引顺序;
索引类型 | 补充说明 |
---|---|
主键 | 唯一,不能为空,表唯一,hash 索引,准确查找,叶子节点存放的是整行数据,属于聚簇索引 |
唯一 | 唯一,可以为空,可以多个 ,hash/btree 索引,叶子节点存放的是主键的值,属于二级索引,效率低于主键索引 |
数据库4个特性:
- 原子性 Atomicity
- 一致性 Consistency
- 隔离性 Consistency
- 持久性 Durability
数据一致性:
- 接口幂等方法:
- 数据库唯一索引;
- token 一次性机制;
- 数据库悲观锁;
- 数据库乐观锁;
- 分布式锁:redis 、zookeeper,等
- 接口参数幂等:source来源,seq序列号
- 业务流程状态机;
- 异步+幂等;