事务四要素ACID:
原子性:事务操作原子性,要么全部成功要么全部失败事务回滚
一致性:事务发生的前后必须保持完整,如果事务失败系统要自动撤回
隔离性:同一时间只允许一个事务请求同一数据,事务之间不受干扰
持久性:事务完成后数据保存在数据库不会回滚和丢失
事务隔离级别:
脏读 | 不可重复读 | 幻读 | |
未提交读 | ✔ | ✔ | ✔ |
已提交读 | × | ✔ | ✔ |
可重复读 | × | × | ✔ |
串行化 | × | × | × |
未提交读:允许脏读,可以读取到其他事务未提交的数据
已提交读:只能读取已提交了的数据
可重复读:同一事务内的查询都跟一开始是一致的,不会受到其他事务的影响
串行化:读写相互阻塞,每次读取都会给表加锁
隔离级别的等级逐级增加,相应的性能消耗也逐级增大
脏读:一个事务修改了数据但没有提交,另一个事务可以读取到修改的数据
不可重复读:两个事务同时读取到了数据,其中一个修改了,另一个事务再次读取的时候发现与第一次读取不一样
幻读:体现在数据量变化,一个事务的两次读取的时候,由于另一个事务增加或删除了数据,导致两次读取的时候数据量不一致
优化:
1.字段类型,尽量按需来定:
(1)无符号数用unsigned
(2)能用char就不用varchar,能用varchar不用text。char会预先分配空间,varchar不会预先分配空间,最大长度5000
(3)有小数用decimal,float和double会损失精度
2.若字段变动频率很低但查询频繁考虑冗余,超长的varchar字段和text字段尽量不做冗余
3.多个字段组成唯一的建组合索引,区分度最高的放最左边
4.join表连接的数据类型保持一致,否则会做转换,降低效率,原则上不超过3个
5.varchar建立索引指定索引长度,没必要做全字段的索引
6.索引失效的情况:
(1)最佳左前缀法则,组合索引未使用最左前缀,查询要从索引的最左前列开始并且不跳过索引中的列,即A、B列做组合索引,查询只用B列时索引失效
(2)mysql认为全表扫描比索引更快时不使用
(3)索引列上存在以下操作时:函数、or、in、!=、全模糊、左模糊、is null、between,例外:如果or的所有列都是索引是会生效的
(4)对于字符串要加引号,否则会做隐式转换不用索引
5.尽量使用覆盖索引,减少select * ,要什么字段就取什么字段
6.统计时使用count(*),不要用count(1)或count(具体列),count(具体列)不会统计NULL值的列。count(distinct col)统计除NULL外不重复行数,如果是多列,其中一列是NULL也不统计