首页 > 数据库 >Mysql

Mysql

时间:2022-11-09 18:01:12浏览次数:91  
标签:事务 读取 幻读 主从复制 索引 Mysql 数据

主从复制

1.什么是主从复制

主从复制是将主数据库的DDL、DML操作通过binlog(二进制日志)的方式传输到从数据库上,然后将这些日志重新执行。

2.主从复制的作用

  • 数据备份
  • 读写分离
  • 高可用和故障切换,当主数据库有问题,可以切换到从数据库

3.主从复制的原理

主从复制主要是依赖binlog和relay log实现的,它的实现原理总结为以下3个方面

  • 主的binlog线程会记录所有改变数据库的语句到master的binlong
  • 从的io线程会拉取master的binlog,然后放进自己的relay log中
  • 从的sql执行线程执行relay的语句

MYISAN和INNODB的区别

MYISAM: 不支持事务、支持表级锁、非聚簇索引、count()有变量存储、无需扫描全表、支持全文索引

INNODB: 支持事务、支持行级锁、聚簇索引

 聚簇索引:叶子节点(索引列+行记录)

非聚簇索引:叶子节点(索引列+主键索引列(聚簇索引))---非聚簇索引查询需要回表

事务的特性(ACID)

  • 原子性:一个事务要么全部成功,要么全部失败
  • 一致性: 事务从一个合法的状态转为另一个合法的状态
  • 隔离性:一个内部事务的操作以及数据的使用对并发的其它事务是隔离的
  • 持久性:一个事务一旦提交,这个事务对数据库的改变是永久性的

事务的四种特征是基于什么机制实现的

  • 隔离性是通过读写锁+MVCC机制实现的
  • 原子性是通过undo log实现的
  • 一致性是通过redo log实现的
  • 原子性、持久性、隔离性都只是手段,它的目的是为了实现一致性

undo log(回滚日志):当一个事务执行一半无法执行时,可以根据回滚日志恢复到变更之前的状态

redo log(重做日志): 每当操作时,在磁盘变更前,将操作写入redo logo, 当系统崩溃重启后可以继续执行

INNODB支持的四种事务隔离级别

参考:https://www.jianshu.com/p/933dbf51eb52

  • 读未提交:容易出现脏写、脏读、不可重复读、幻读

  • 读已提交:容易出现不可重复读、幻读
  • 可重复读:容易出现幻读
  • 串行化:可避免脏读、不可重复读、幻读

脏读:A、B两个事物, A事物读取了B事物未提交的数据,B事务回滚之后,造成了A事务的脏读

不可重复读:A、B两个事物,A事务读取了B已提交的数据,事务B再对数据进行更新,事务A两次读取到的数据不一致

幻读:事务A按范围读取N行数据,事务B更新或新增数据,数据A再读取相同范围的数据时,与首次读取的行数不同

InnoDB的默认隔离级别可重复读,该级别的不可重复读是通过MVCC实现的,幻读是通过间隙锁实现的。

间隙锁不是对具体的数据行加锁,而是对具体数据行之间的间隙加锁

数据并发产生的问题

  • 脏写:事务A修改了事务B未提交的数据
  • 脏读:事务A读取到了事务B未修改过的数据
  • 不可重复读:A、B两个事物,A事务读取了B已提交的数据,事务B再对数据进行更新,事务A两次读取到的数据不一致

  •  

    幻读:事务A按范围读取N行数据,事务B更新或新增数据,数据A再读取相同范围的数据时,与首次读取的行数不同

Mysql中有哪几种锁

参考:https://www.cnblogs.com/wenxuehai/p/15948248.html

  • 按数据的操作类型分:共享锁(S锁、读锁)、排它锁(X锁、写锁)
  • 按数据的操作粒度分:表级锁、行级锁、业级锁
  • 按数据的操作类型分::悲观锁、乐观锁

表级共享锁:读锁阻塞写,不会阻塞读

表级排它锁:写锁会阻塞其它会话的读写

悲观锁:总是假设别人会修改当前数据,所以每次读取的时候总是加锁(读写都加锁)

乐观锁:总是假设被人不会同时修改当前数据,所以每次读取的时候不会加锁,只有在更新数据的时候通过version判断数据是否被更改

行级锁:只有innoDB才有行级锁,且只有修改的条件为索引列时才会有行级锁,行级锁只锁修改,不锁查询

 索引分类有哪些?

  • 普通索引
  • 唯一索引
  • 主键索引
  • 联合索引
  • 全文索引

索引失效的情况

  • 使用like %%查询
  • 未遵循最左前缀法
  • 计算、函数、类型转换
  • 使用is null, is not null不会让索引失效
  • 使用!=
  • or前的列建立了索引,or 后的列没建索引

标签:事务,读取,幻读,主从复制,索引,Mysql,数据
From: https://www.cnblogs.com/Auge/p/16870506.html

相关文章

  • mysql批量制造数据
    DELIMITER$$CREATEPROCEDUREprocess_test3()BEGINDECLAREyouridINT;SETyourid=100000;WHILEyourid<2000000DOINSERTINTOtt(order_no)VALUES(yourid)......
  • VS_QT——连接MySQL数据库
    原文链接连接2链接3           ......
  • mysql rpm安装
    目录mysqlrpm安装安装包下载安装mysqlmysqlrpm安装安装包下载官网:https://dev.mysql.com/downloads/mysql/下载完成后你应该拥有下面四个包文件安装mysql//安装......
  • mysql mysqldump常见报错
    目录mysqlmysqldump常见报错ERROR2006(HY000)atline5922:MySQLserverhasgoneawaymysqlmysqldump常见报错ERROR2006(HY000)atline5922:MySQLserverha......
  • Docker安装Mysql8
    ​​CentOS7.9安装Docker​​拉取mysql镜像搜寻仓库里面有那些镜像dockersearchmysql我们拉取mysql:latest的镜像dockerpullmysql:latest查看镜像但是我们不知道m......
  • windows版数据库mysql的安装
    一、下载MySQLMysql官网下载地址:MySQL::DownloadMySQLInstaller(ArchivedVersions)1.选择要安装的版本,本篇文章选择的是5.7.31版本,点击Download下载 正在上传......
  • MySQL 正则表达式
    一.介绍正则表达式用来描述或者匹配符合规则的字符串。它的用法和like比较相似,但是它又比like更强大,能够实现一些很特殊的规则匹配;正则表达式需要使用REGEXP命令,匹配上返回"......
  • Ubuntu离线安装 MySQL 5.7
    来源:https://www.ngui.cc/article/show-581968.html?action=onClick一、所需环境操作系统:Ubuntu 20.04数据库:MySQL5.7.34网络情况:内网服务器,无法访问互联网资源......
  • 记录实际项目中使用过的Mysql的脚本
    一、修改数据库编码及字符集(比较简单,在可视化工具中直接改了,也可以使用如下命令)--可直接复制运行ALTERDATABASEdb_nameCHARACTERSET=utf8mb4COLLATE=utf8mb4_bin;......
  • Mysql中关于主键设计的引发的思考
    一、主键设计原则尽量单列,提高连接和筛选效率不包含动态变化的数据(时间戳,创建、修改时间列)由计算机自动生成(选取合适的生成策略)二、添加方式手动建表指定生成策略基于JPA的......