MySQL的故事——MySQL架构与历史

MySQL架构与历史

文章目录

  • MySQL架构与历史
  • 一、MySQL逻辑架构
  • 二、并发控制
  • 三、事务
  • 四、多版本并发控制(MVCC)


一、MySQL逻辑架构

在这里插入图片描述
第一层:连接处理、授权认证、安全等等
第二层:查询解析、分析、优化、缓存以及所有的内置函数。包含跨存储引擎的功能:存储过程、触发器、视图等
第三层:存储引擎。负责MySQL中数据的存储和提取

二、并发控制

无论何时,只要有多个查询需要在同一时刻修改数据,都会产生并发控制的问题。
讨论mysql两个层面的并发控制:存储引擎层与服务器层

读写锁
在处理并发写或并发读写时,可以使用两种类型的锁组成的锁系统来解决问题。这两种锁就是共享锁(读锁)和排他锁(写锁)。读锁是共享的,互相不阻塞;写锁是排他的,只有一个线程能进行写操作,其它读锁和写锁都是阻塞的。
并且,写锁拥有更高的优先级。在一个锁队列中,写锁可以插到读锁的前面。

锁粒度
一种理想的锁方式是,尽量只锁定需要修改的资源,而不是所有资源。锁定的数据量越小,并发程度越高。
但是也是需要时空开销的,判断是否有锁、加锁、释放锁的操作都需要额外的开销,如果锁粒度太小,虽然并发程度高,但系统花大量资源去管理锁,而不是存取数据,也是得不偿失。

锁策略
就是在锁的开销和数据安全性之间寻求平衡。大多数数据库都是行级锁,而mysql提供了更多锁的可能性。每种存储引擎都可以实现自己的锁策略和锁粒度。将锁粒度固定在某一级别,可以为特定的应用场景提供更好的性能,但同时也会失去对一些应用场景的支持。但好在mysql支持多个存储引擎。

表锁
表锁是mysql中最基本、开销最小的锁策略。尽管存储引擎可以设计管理自己的锁,但mysql服务器还是利用表锁来实现不同的目的。例如:会为alter table 之类的语句使用表锁,而忽略存储引擎的锁机制

行级锁
行级锁是mysql中并发量最大、开销最大的锁策略。行级锁只在存储引擎层实现,服务器没有实现。并且服务器层完全不了解存储引擎层的锁实现。

三、事务

事务是一组原子性的操作,是一个独立执行单元。事务内的语句,要么全部执行成功,要么全部执行失败。

事务的四个标准特征(ACID):
原子性(atomicity):一个事务必须被视为不可分割的最小工作单元,整个事务的所有操作要么全部提交成功,要么全部失败回滚。
一致性(consistnecy):数据库总是保持一致性的状态
隔离性(isolation):通常来说,一个事务在没有最终提交以前,对其它事务是不可见的
持久性(durability):一旦事务提交,则其所做的修改就会永久保存到数据库中。

隔离级别
未提交读(READ UNCOMMITTED):事务中的修改,即使没有提交,对其它事务也都是可见的。脏读问题(事务1改,事务2读,事务1回滚)。
提交读(READ COMMITTED):大多数数据库的默认隔离级别是提交读(MySQL不是)。事务从开始直到提交之前,所做的修改对其它事务都是不可见的。也叫不可重复读。不可重复读问题(事务1读,事务2改,事务1读)
可重复读(REPEATABLE READ):保证在同一个事务中多次读取同样记录的结果是一致的。可重复读是MySQL的默认事务隔离级别。幻读问题(事务1范围操作,事务2插入数据,事务1读,产生幻行)
可串行化(SERIALIZABLE):非常需要数据的一致性和接受没有并发的情况下,才考虑该级别。

死锁
当两个或多个事务占用着自己的资源,而都在等待对方占用的资源时,会形成死锁。
解决死锁问题的方法:
一种是在事务开始前检测死锁的循环依赖,若有可能导致死锁,则报错。
一种是发生死锁时,设置最长等待时间,大于这个时间则放弃资源(不推荐,性能变差)
一种是发生死锁时,将拥有最少行级写锁的事务回滚。

四、多版本并发控制(MVCC)

以InnoDB的MVCC为例,InnoDB以每行记录后面保存两个隐藏的列来实现MVCC。这两个列,一列保存这一行的创建时间,一列保存这一行的过期时间。但存储的并不是真正的时间,而是系统版本号。每开始一个事务,系统版本号就会自增。事务通过自身的系统版本号与这两个隐藏的列对比,来操作数据。

在可重复读的隔离级别下,InnoDB的MVCC的具体操作如下:
select InnoDB查找创建系统版本号小于等于事务系统版本号的行,即在事务开始前就存在的行,或者由事务自身插入或修改的行。同时该行的过期系统版本号要么未定义,要么大于事务系统版本号。
insert 新插入的每一行创建时间都是当前事务的系统版本号。
delete 删除的每一行的过期时间都是当前事务的系统版本号。
update 插入一条新数据,创建时间是当前事务的系统版本号,将原来行的过期时间设置为 当前事务的系统版本号。

MVCC只在提交读和可重复读两个隔离级别下工作,因为未提交读总是能读取到最新的行,而不是符合当前事务版本的行,而串行化会对所有行加锁。

MyISAM和InnoDB的区别
事务:MyISAM不支持事务,InnoDB支持事务。
锁粒度:MyISAM只支持表锁,InnoDB支持行锁。
存储:MyISAM存三个文件(.frm .MYD .MYI),支持动态 ,静态和压缩三种压缩格式。InnoDB存一个文件(.frm)。
外键:MyISAM不支持外键,InnoDB支持外键。
索引:MyISAM是索引+行指针,InnoDB是聚簇+非聚簇(这个点决定了其主键的必要性)。
安全:MyISAM不支持崩溃安全恢复,InnoDB支持(redo_log)。
行数统计:MyISAM中维护一个计数器记录总行数,select(*)时很快,而InnoDB需要全表扫描,所以很慢。


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/72189.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Matlab图像处理-

有些时候,直接利用图像的灰度直方图选择阈值不是非常直观,这时,可以利用图像三个通道的直方图来进行图像分割,操作步骤如上文所示,下图为原始图片。 下图为三通道直方图。 下图将三个通道的直方图会绘制到一个图表上&a…

【完整代码】2023数学建模国赛C题代码--蔬菜类商品的自动定价与补货决策

C 题 蔬菜类商品的自动定价与补货决策 在生鲜商超中,一般蔬菜类商品的保鲜期都比较短,且品相随销售时间的增加而变差, 大部分品种如当日未售出,隔日就无法再售。因此,商超通常会根据各商品的历史销售和需 求情况每天进…

c高级 day1

使用cut截取出Ubuntu用户的家目录,要求:不能使用":"作为分割 xmind:

从智能手机到智能机器人:小米品牌的高端化之路

原创 | 文 BFT机器人 前言 在前阵子落幕的2023世界机器人大会“合作之夜”上,北京经济技术开发区管委会完成了与世界机器人合作组织、小米机器人等16个重点项目签约,推动机器人创新链和产业链融合,其中小米的投资额达到20亿! 据了…

分布式调度Elastic-job

分布式调度Elastic-job 1. 概述 1.1什么是任务调度 我们可以思考⼀下下⾯业务场景的解决⽅案: 某电商平台需要每天上午10点,下午3点,晚上8点发放⼀批优惠券某银⾏系统需要在信⽤卡到期还款⽇的前三天进⾏短信提醒某财务系统需要在每天凌晨0:10分结算前…

PostMan传时间参数一次性发送多次请求

文章目录 1. Date类型的参数, "date": "2023-09-07 22:01:51"格式会报错2. 在Pre-request Script预置时间3. 使用postman一次性发送多次请求 1. Date类型的参数, “date”: "2023-09-07 22:01:51"格式会报错 2. 在Pre-req…

算法 数据结构 斐波那契数列 递归实现斐波那契数列 斐波那契递归的优化 斐波那契数列递归求解 多路递归实现 斐波那契算法系列 数据结构(十一)

1. 什么是斐波那契数列: 之前的例子是每个递归函数只包含一个自身的调用,这称之为 single recursion 如果每个递归函数例包含多个自身调用,称之为 multi recursion 递推关系 下面的表格列出了数列的前几项 F0F1F2F3F4F5F6F7F8F9F10F11F12…

前端 JS 经典:上传文件

重点&#xff1a;multipart/form-data 后端识别上传类型必填 1. form 表单上传 <!-- enctype"multipart/form-data" 这个必填 --> <form action"http://127.0.0.1:8080/users/avatar" method"post" enctype"multipart/form-data…

SQL语言的分类:DDL(数据库、表的增、删、改)、DML(数据的增、删、改)

数据库管理系统&#xff08;数据库软件&#xff09;功能非常多&#xff0c;不仅仅是存储数据&#xff0c;还要包含&#xff1a;数据的管理、表的管理、库的管理、账户管理、权限管理等。 操作数据库的SQL语言&#xff0c;基于功能&#xff0c;划分为4类&#xff1a; 1、数据定…

使用半导体材料制作霍尔元件的优点

霍尔元件是一种基于霍尔效应的传感器&#xff0c;可以测量磁场强度和电流等物理量。霍尔效应是指&#xff0c;当电流通过一块导体时&#xff0c;如果该导体置于垂直于电流方向的磁场中&#xff0c;就会在导体两侧出现一定的电势差&#xff0c;这就是霍尔效应。霍尔元件可以利用…

PHP8函数包含文件-PHP8知识详解

在php中&#xff0c;可以使用以下函数来包含其他文件&#xff1a;include()、include_once()、require()、require_once()。 1、include(): 包含并运行指定文件中的代码。如果文件不存在或包含过程中出现错误&#xff0c;将发出警告。 <?php include filename.php; ?>…

与 vmx86 驱动程序的版本不匹配: 预期为 410.0,实际为 401.0

与 vmx86 驱动程序的版本不匹配: 预期为 410.0&#xff0c;实际为 401.0。 驱动程序“vmx86.sys”的版本不正确。请尝试重新安装 VMware Workstation。 我电脑历史上装过几个版本的vmware workstation: 怀疑是不兼容版本生成的vmx.86.sys 在系统中和该软件冲突&#xff0c;又没…

Redis总结(三)

目录 什么是缓存预热、缓存雪崩、缓存击穿、缓存穿透&#xff1f; 缓存预热 缓存雪崩 解决方案 针对Redis故障宕机 针对大量key同时过期 缓存击穿 解决方案 缓存穿透 解决方案 总结 数据库和缓存如何保证一致性&#xff1f; 先更新缓存还是先更新数据库&#xff1…

【sgLazyCascader】自定义组件:基于el-cascader的懒加载级联菜单,支持异步加载子级菜单

sgLazyCascader源码 <template><div :class"$options.name"><el-cascader :props"props" v-model"model" :placeholder"placeholder || 请选择" :options"options"></el-cascader></div> &l…

【Docker】镜像的创建、管理与发布

镜像的获取 镜像可以从以下方式获得&#xff1a; 从远程镜像仓库拉取&#xff0c;可以是公有仓库&#xff0c;也可以是私有仓库从Dockerfile构建从文件导入&#xff08;离线&#xff09;从容器提交 镜像的基本操作 跟镜像相关的命令如下&#xff1a; $ docker image --help…

大数据-玩转数据-Flink状态编程(上)

一、Flink状态编程 有状态的计算是流处理框架要实现的重要功能&#xff0c;因为稍复杂的流处理场景都需要记录状态&#xff0c;然后在新流入数据的基础上不断更新状态。 SparkStreaming在状态管理这块做的不好, 很多时候需要借助于外部存储(例如Redis)来手动管理状态, 增加了编…

macbookpro怎么删除软件没有鼠标

macbookpro怎么删除软件没有鼠标,macbookpro触摸板可以替代鼠标进行操作。左右键功能与鼠标相同&#xff0c;可用于执行删除操作。此外&#xff0c;还可以利用键盘上的Delete键来删除选中的文件。 删除软件方法 方法1、打开应用程序&#xff0c;键盘按住control&#xff0c;加点…

数据结构与算法之贪心动态规划

一&#xff1a;思考 1.某天早上公司领导找你解决一个问题&#xff0c;明天公司有N个同等级的会议需要使用同一个会议室&#xff0c;现在给你这个N个会议的开始和结束 时间&#xff0c;你怎么样安排才能使会议室最大利用&#xff1f;即安排最多场次的会议&#xff1f;电影的话 那…

高等数学教材重难点题型总结(四)不定积分

难点在于量级&#xff0c;不定积分一定要多练多见才能游刃有余~ 1.利用求导公式验证等式 2.计算不定积分

C语言——指针完全版

目录 一、指针的运算 1.1指针 - 整数 1.2指针 - 指针 二、指针遍历数组 2.1指针遍历数组 1.了解数组名称的含义&#xff08;&数组名和数组名的区别&#xff09;。 2.用指针遍历数组 三、指针数组、数组指针、函数指针 3.1指针数组 3.1.1指针数组的形式 3.1.2指针…