MySQL基础之事务的四大特性,主从复制,binlog日志,mysql优化

目录:

事务
主从复制
binlog日志
mysql优化

一.事务原理

  • 事务(Transaction)是数据库区别于文件系统的重要特性之一,事务就是用户定义的一系列执行SQL语句的操作,这些操作要么完全地执行,要么完全地都不执行, 它是一个不可分割的工作执行单元。

1.事务的使用场景:

  • 在日常生活中,有时我们需要进行银行转账,这个银行转账操作背后就是需要执行多个SQL语句,假如这些SQL执行到一半突然停电了,那么就会导致这个功能只完成了一半,这种情况是不允许出现,要想解决这个问题就需要通过事务来完成。

2.事务的(ACID)特征:

  • 原子性(Atomicity):整个事物的所有操作要么全部提交成功,要么全部失败回滚(不会出现部分执行的情况)。
  • 一致性(Consistency):几个并行执行的事务,其执行结果必须与按某一顺序串行执行的结果相一致。
  • 隔离性(Isolation):事务的执行不受其他事务的干扰,事务执行的中间结果对其他事务必须是透明的。(和事务的隔离级别有关联)
  • 持久性(Durability):
    一个事务一旦被提交了,那么对数据库中的数据的改变就是永久性的,即便是在数据库系统遇到故障的情况下也不会丢失提交事务的操作

3.事务的隔离级别:

未提交读: 脏读(READ UNCOMMITTED):

  • 指一个事务A正在访问数据,并且对该数据进行了修改,但是这种修改还没有提交到数据库中(也可能因为某些原因Rollback了)。这时候另外一个事务B也访问这个数据,然后使用了这个被A修改的数据,那么这个数据就是脏的,并不是数据库中真实的数据。这就被称作脏读。
  • 解决办法:把数据库事务隔离级别调整到READ_COMMITTED
  • 即让用户在更新时锁定数据库,阻止其他用户读取,直到更新全部完成才让你读取。

提交读: 不可重复读(READ COMMITTED):

  • 指在一个事务A内,多次读同一个数据,但是事务A没有结束时,另外一个事务B也访问该同一数据。那么在事务A的两次读数据之间,由于事务B的修改导致事务A两次读到的数据可能是不一样的。这就发生了在一个事务内两次读到的数据不一样,这就被称作不可重复读。

  • 解决办法:把数据库事务隔离级别调整到REPEATABLE_READ

可重复读: 幻读(REPEATABLE READ):

  • 这是MySQL的默认事务隔离级别

  • 指一个事务A对一个表中的数据进行了修改,而且该修改涉及到表中所有的数据行;同时另一个事务B也在修改表中的数据,该修改是向表中插入一行新数据。那么经过这一番操作之后,操作事务A的用户就会发现表中还有没修改的数据行,就像发生了幻觉一样。这就被称作幻读。

  • 解决办法:把数据库事务隔离级别调整到SERIALIZABLE_READ

可串行读(SERIALIZABLE):

  • 这是事务的最高隔离级别,通过强制事务排序,使之不可能相互冲突,就是在每个读的数据行加上共享锁来实现在该隔离级别下,可以解决前面出现的脏读、不可重复读和幻读问题,但也会导致大量的超时和锁竞争现象,一般不推荐使用

二. MySQL 主从复制

概念:

  • MySQL 主从复制是指数据可以从一个MySQL数据库服务器主节点复制到一个或多个从节点。MySQL默认采用异步复制方式,这样从节点不用一直访问主服务器来更新自己的数据,数据的更新可以在远程连接上进行,从节点可以复制主数据库中的所有数据库或者特定的数据库,或者特定的表。

常见的几种主从架构:

  1)单向主从模式:Master ——> Slave
  2)双向主从模式:Master <====> Master
  3)级联主从模式:Master ——> Slave1 ——> Slave2

主从复制功能:

  1)实时灾备
  2)读写分离
  3)高可用
  4)从库数据统计
  5)从库数据备份
  6)平滑升级

主从复制原理:

  • 主从同步过程中主服务器有一个工作线程I/O dump thread,从服务器有两个工作线程I/O thread和SQL thread。
  • 主库把外界接收的SQL请求记录到自己的binlog日志中,从库的I/O thread去请求主库的binlog日志,并将binlog日志写到中继日志中,然后从库重做中继日志的SQL语句。主库通过I/O dump thread给从库I/O thread传送binlog日志。(I/O线程)

三. binlog 基本认识

1.一些概念:

  • MySQL的二进制日志可以说是MySQL最重要的日志了,它记录了所有的DDL和DML(除了数据查询语句)语句,以事件形式记录,还包含语句所执行的消耗的时间,MySQL的二进制日志是事务安全型的。

  • 一般来说开启二进制日志大概会有1%的性能损耗(参见MySQL官方中文手册 5.1.24版)。二进制有两个最重要的使用场景:

    • 其一:MySQLReplication在Master端开启binlog,Mster把它的二进制日志传递给slaves来达到master-slave数据一致的目的。

    • 其二:自然就是数据恢复了,通过使用mysqlbinlog工具来使恢复数据。

  • 二进制日志包括两类文件:二进制日志索引文件(文件名后缀为.index)用于记录所有的二进制文件,二进制日志文件(文件名后缀为.00000*)记录数据库所有的DDL和DML(除了数据查询语句)语句事件。

2.常用binlog日志操作命令

1.查看所有binlog日志列表
  mysql> show master logs;

2.查看master状态,即最后(最新)一个binlog日志的编号名称,及其最后一个操作事件pos结束点(Position)值
  mysql> show master status;

3.刷新log日志,自此刻开始产生一个新编号的binlog日志文件
  mysql> flush logs;
  注:每当mysqld服务重启时,会自动执行此命令,刷新binlog日志;在mysqldump备份数据时加 -F 选项也会刷新binlog日志;

4.重置(清空)所有binlog日志
  mysql> reset master;

四.mysql优化

1.主要包括

表的设计合理化(符合3NF)

添加适当索引(index) [四种: 普通索引、主键索引、唯一索引unique、全文索引]

分表技术(水平分割、垂直分割)

读写[: update/delete/add]分离

存储过程 [模块化编程,可以提高速度]

对mysql配置优化 [配置最大并发数my.ini, 调整缓存大小 ]

mysql服务器硬件升级

定时的去清除不需要的数据,定时进行碎片整理(MyISAM)

2.数据库优化工作

对于一个以数据为中心的应用,数据库的好坏直接影响到程序的性能,因此数据库性能至关重要。一般来说,要保证数据库的效率,要做好以下四个方面的工作:

① 数据库设计

② sql语句优化

③ 数据库参数配置

④ 恰当的硬件资源和操作系统

此外,使用适当的存储过程,也能提升性能。

这个顺序也表现了这四个工作对性能影响的大小

3.数据库表设计

通俗地理解三个范式,对于数据库设计大有好处。在数据库设计中,为了更好地应用三个范式,就必须通俗地理解三个范式(通俗地理解是够用的理解,并不是最科学最准确的理解):

  • 第一范式:1NF是对属性的原子性约束,要求属性(列)具有原子性,不可再分解;(只要是关系型数据库都满足1NF)
  • 第二范式:2NF是对记录的惟一性约束,要求记录有惟一标识,即实体的惟一性;
  • 第三范式:3NF是对字段冗余性的约束,它要求字段没有冗余。 没有冗余的数据库设计可以做到。
  • 但是,没有冗余的数据库未必是最好的数据库,有时为了提高运行效率,就必须降低范式标准,适当保留冗余数据。具体做法是:在概念数据模型设计时遵守第三范式,降低范式标准的工作放到物理数据模型设计时考虑。降低范式就是增加字段,允许冗余。
发布了46 篇原创文章 · 获赞 10 · 访问量 1833

猜你喜欢

转载自blog.csdn.net/longlong6682/article/details/104807500
今日推荐