MySQL
事务
数据库中事务是一组操作,要么都执行,要么都不执行。
四个特性(ACID):InnoDB支持(MyISAM不支持这四个特性)
1、A(atomicity),原子性。指每个事务都是不可分割的工作单位,要么都执行成功,要么都执行不成功
2、C(consistency),一致性。事务将数据库从一种状态转变为另一种状态。事务开始前和结束后,数据库的完整性没有被破坏
3、I(isolation),隔离性。并发访问数据库时,一个用户的事务不被其他事务所干扰,各并发事务之间数据库是独立的,一般由锁来实现
4、(durability),持久性。一个事务被提交后,它对数据库的改变是持久的,即使数据库发生故障也不应该对其有任何影响
原子性、隔离性和持久性的存在是为了保障一致性
原子性的回滚机制
如何实现undo log?
在事务中,每一条SQL通过执行器后,第一时间就会在UNDO LOG SEGMENT 中申请一个UNDO LOG页,然后根据SQL信息构造对应的UNDO LOG内容同时将其写入磁盘,以保证每次操作真正数据之前UNDO LOG是完整的。这样即使发生异常也可以完美的撤销。

隔离性的一系列场景
脏读:事务A读取到了事务B还没有提交的数据

不可重复读:事务A两次读取同一条数据,在事务A两次读取的间隙,事务B对数据进行修改并提交,导致事务A两次读取到不一致的数据

幻读:事务A两次读取同一数据,在两次读取间隙,事务B删除或者增加了部分数据,导致事务A两次读取到了数量不一致的行数据

解决方案:四种隔离级别

封锁
封锁粒度
MySQL提供了两种封锁粒度,行级锁和表级锁。
应该只锁定需要修改的那部分数据,而不是所有的资源。锁定的数据量越少,并发时发生锁争用的可能就越少,系统的并发程度越高
但是加锁需要消耗额外的资源
- 封锁的粒度越大 数据库能够封锁的数据单元就越少,并发度就越小,系统开销也就越小
 - 封锁的粒度越小 数据库能够封锁的数据单元就越多,并发度就越高,系统开销也就越大
 
封锁类型
1.读写锁
互斥锁:简写X锁,又称写锁
共享锁:简写S锁,又称读锁
- 一个事务对数据对象 A 加了 X 锁,就可以对 A 进行读取和更新。加锁期间其它事务不能对 A 加任何锁。
 - 一个事务对数据对象 A 加了 S 锁,可以对 A 进行读取操作,但是不能进行更新操作。加锁期间其它事务能对 A 加 S 锁,但是不能加 X 锁。
 
索引
索引失效
1.在索引列上进行运算操作
explain select * from tb_user where phone = '17799990015'; 不失效
explain select * from tb_user where substring(phone,10,2); 失效
2.字符串查询不加引号
explain select * from tb_user where phone = '17799990015'; 不失效
explain select * from tb_user where phone = 17799990015; 失效
3.模糊查询(尾部模糊不会失效,头部模糊会失效)
explain select * from tb_user where profession like '软件%'; 不失效
explain select * from tb_user where profession like '%工程'; 失效
4.or 连接的条件
用or分隔开的条件,如果or前的条件中的列有索引,而后面的列中没有索引,那么涉及到的索引都不会被用到
explain select * from tb_user where id = '10' or age = 23; 失效
explain select * from tb_user where phone = '17799990015' or age = 23; 失效
5.mysql评估索引查询比全表更慢,走全表(受数据分布影响)
                    
                
                
            
        
浙公网安备 33010602011771号