mysql事务优化
我们对数据进行sql操作,就是从从磁盘上取出数据(页),存放在内存中,但是并不是只有我们一个人再用,还有其他的进程也在使用内存,MySQL中有一个单独的区域存放我们的页数据(Buffer Pool)。
Buffer Pool 缓冲池
InnoDB中的,不属于mysql。
ACID靠什么保证
A 原子性,有 undo log 日志保证,他记录了需要回滚的的日志信息,事务回滚时撤销已经执行成功的sql
C 一致性由其他三大特性保证,程序代码要保证业务上一致性
I 隔离性由 MVCC 保证
D 持久性,由内存+redo log来保证,mysql修改数据的同时在内存和redo log记录这次操作,数据库宕机的时候可以从redo log 恢复
redo log 和 bin log 区别
redo log: 是 InnoDB 层级的,用于保证事务的一致性,存储的是具体哪页的哪行数据进行的修改
bin log:是mysql层级的,用于主从复制/同步,存储的是sql语句
MVCC概念
多版本并发控制,用来解决读写不冲突无锁的并发控制。--- 只在RC 和 RR隔离级别下生效
像 select lock in share mode 共享锁,select for update 排他锁,update,delect,insert (排他锁)这些操作都是一种当前读,就是它读取的是当前最新的版本,读取的时候还不允许其他并发事务进行修改,会对读取的记录进行加锁。
快照读(提高数据库的并发查询能力)
不加锁的select操作就是快照读,即不加锁的非阻塞读;快照读的前提是隔离级别不是串行化,串行化的隔离级别,快照读退化为当前读;之所以会出现快照读,就是基于并发性能的考虑,快照读的实现基于多版本并发控制,即MVCC,可以认为MVCC是行锁的一个变种,但它在很多情况下,避免了加锁操作,降低了开销,既然是基于多版本,快照读可能读的数据不一定是数据的最新版本,可能是之前的历史版本
当前读和快照读,MVCC的关系
MVCC多版本并发控制指的是维持一个数据的多个版本,使得读写操作没有冲突,快照读是MySql为实现MVCC的一个非阻塞读功能,MVCC模块在Mysql中具体实现由三个隐式字段,undolog,read view 三个组件来实现。在RC(读已提交)隔离级别下,,每个快照读都会生成并获取最新的Read view ,而在RR(可重复读)隔离级别下,则是同一个事务中第一个快照读才会创建Read view ,之后的快照读获取的都是同一个Read view。
MVCC解决什么问题
数据并发有三种场景,
读读:不存在任何问题,也不需要并发控制
读写:有线程安全问题,可能会造成事务隔离性问题,造成脏读,幻读,不可重复读
写写:有线程安全问题,可能存在更新丢失问题
MVCC是一种用来解决读写冲突的无锁并发控制,也就是为事务分配单项增长的时间戳,为每个修改保存一个版本,版本和时间戳关联,读操作只读事务开始前的数据快照,所以MVCC可以为数据库解决以下问题
1.在并发读写数据库时,可以做到读操作时不堵塞写操作,写操作不堵塞读操作,提高了数据库并发读写的性能
2.解决了脏读,幻读,不可重复读等事务隔离问题,但不能解决更新丢失问题
主从同步
原理
mysql主从同步的过程:
Mysql的主从复制中主要有三个线程:master(bin log dump thread)、slave (I/0 thread 、SQLthread) ,Master一条线程和Slave中的两条线程。
主节点 binlog,主从复制的基础是主库记录数据库的所有变更记录到 binlog。binlog 是数据库服务器启动的那一刻起,保存所有修改数据库结构或内容的一个文件。- 主节点 log dump 线程,当 binlog 有变动时,log dump 线程读取其内容并发送给从节点。
- 从节点 I/O线程接收 binlog 内容,并将其写入到 relay log 文件中
- 从节点的SQL 线程读取 relay log 文件内容对数据更新进行重放,最终保证主从数据库的一致性。
注:主从节点使用 binglog 文件+position 偏移量来定位主从同步的位置,从节点会保存其已接收到的偏移量,如果从节点发生宕机重启,则会自动从 position 的位置发起同步。
由于mysql默认的复制方式是异步的,主库把日志发送给从库后不关心从库是否已经处理,这样会产生一个问题就是假设主库挂了,从库处理失败了,这时候从库升为主库后,日志就丢失了。由此产生两个概念。
全同步复制 :主库写入bin log 后强制同步日志到从库,所有的从库都执行完成后才返回给客户端,但是很显然这个方式的话性能会受到严重影响
半同步复制 : 和全同步不同,从库写入日志成功之后,返回ACK确认给主库,主库收到至少一个从库的确认就认为写操作完成。
mysql为什么需要主从同步
1.在业务复杂的系统中,有这么一个场景,有一句sql语句需要锁表,导致暂时不能使用读的服务,那么就很影响运行中的业务,使用主从复制,让主库负责写,从库负责读,这样,即使主库出现了锁表的情景。通过读从库也可以保证业务的正常运行。
2.做数据的热备
3.架构的扩展,业务量越来越大,IO访问频率过高,单机无法满足,此时做多库的存储,降低磁盘的IO访问的频率,提高单个机器的IO性能