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

news2024/11/25 7:40:14

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.coloradmin.cn/o/977950.html

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

相关文章

【数据结构与算法】十大经典排序算法

文章目录 前言一、常见十大排序算法总结1、名词解释2、时间复杂度 二、排序算法与C语言实现1、冒泡排序2、选择排序3、插入排序4、希尔排序5、归并排序6、快速排序7、堆排序8、计数排序9、桶排序10、基数排序 总结 前言 排序算法是《数据结构与算法》中最基本的算法之一。 排序…

java:操作cookie

背景 cookie 是一种客户端会话技术,将数据保存到客户端。主要流程就是: 1、服务器把数据设置到cookie并返回给浏览器 2、浏览器自动保存 3、浏览器下一次发送请求自动携带cookie给服务器 我们主要来看一下 java 是怎么操作 cookie 的。 cookie介绍 特…

区块链技术与应用 - 学习笔记2【密码学基础】

大家好,我是比特桃。本系列笔记只专注于探讨研究区块链技术原理,不做其他违反相关规定的讨论。 区块链技术已被纳入国家十四五规划,在“加快数字发展 建设数字中国”篇章中,区块链被列为“十四五”七大数字经济重点产业之一&#…

Node.js安装使用

目录 一、安装 Node.js二、环境变量配置三、npm常用命令 Node.js 是一个强大的运行时环境,它使您能够在服务器端运行 JavaScript 代码。它非常流行,用于构建 Web 应用程序、API 和各种后端服务。 一、安装 Node.js 1、访问 Node.js 官方网站。 在主页上…

算法训练day34|贪心算法 part03(LeetCode 1005.K次取反后最大化的数组和、134. 加油站、135. 分发糖果(处理一边再处理一边))

文章目录 1005.K次取反后最大化的数组和思路分析代码实现 134. 加油站暴力方法贪心方法 135. 分发糖果(处理一边再处理一边)思路分析代码实现思考总结 1005.K次取反后最大化的数组和 题目链接🔥 给定一个整数数组 A,我们只能用以下方法修改该数组&#…

使用redis实现队列功能

使用redis实现队列功能 操作方法描述LPUSHLong lPush(String key, String… values)将一个或多个值 value 插入到列表 key 的表头,返回插入后列表中value的数量,若key不存在,会创建一个新的列表并执行 LPUSH 操作RPOPLPUSHString rPopLPush(S…

hive安装步骤

centos7安装hive,hive版本3.1.2 一、环境准备 JDK版本:jdk-8u381 Hadoop版本:hadoop-3.1.3 MySQL版本:8.0.34 二、hive安装步骤 1.解压 将压缩包复制到/opt/software目录下,并解压至/opt/module/目录 tar -zxf…

bootstrap 导航栏下拉菜单,居右下拉菜单

<!DOCTYPE html> <html lang"en"> <head><!-- 新 Bootstrap5 核心 CSS 文件 --> <link rel"stylesheet" href"bootstrap-5.0.0-beta1-dist/css/bootstrap.min.css"><!-- 最新的 Bootstrap5 核心 JavaScript 文…

Ubuntu22.04 LTS 显卡相关命令

第一部分查看驱显卡信息 一、查看显卡型号 # -i表示不区分大小写 lspci | grep -i nvidia # 必须安装好nvidia驱动 nvidia-smi -L 二、查看显卡驱动版本 cat /proc/driver/nvidia/version 三、查看CUDA、cuDNN版本 # 或者 nvcc -V&#xff08;两个显示的版本一致&#xf…

指针和字符数组笔试题及其解析(第一组)

个人主页&#xff1a;Lei宝啊 愿所有美好如期而遇 前言&#xff1a; 数组名在寻常情况下表示首元素地址&#xff0c;但有两种情况例外&#xff1a; 1.sizeof(数组名)&#xff0c;这里的数组名表示整个数组&#xff0c;计算的是整个数组的大小 2.&数组名&#xff0c;这里的…

【KRouter】一个简单且轻量级的Kotlin Routing框架

【KRouter】一个简单且轻量级的Kotlin Routing框架 KRouter&#xff08;Kotlin-Router&#xff09;是一个简单而轻量级的Kotlin路由框架。 具体来说&#xff0c;KRouter是一个通过URI来发现接口实现类的框架。它的使用方式如下&#xff1a; val homeScreen KRouter.route&l…

C# PSO 粒子群优化算法 遗传算法 随机算法 求解复杂方程的最大、最小值

复杂方程可以自己定义&#xff0c;以下是看别人的题目&#xff0c;然后自己来做 以下是计算结果 private void GetMinResult(out double resultX1, out double min){double x1, result;Random random1 new Random(DateTime.Now.Millisecond* DateTime.Now.Second);min 99999…

创建MyBatis的映射文件模板

Settings->Editor->->Code Style->File and Code Templates <?xml version"1.0" encoding"UTF-8" ?> <!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dt…

tomcat部署、tomcat虚拟主机及tomcat多实例

目录 一、Tomcat概述 tomcat是什么&#xff1f; 什么是 servlet&#xff1f; 什么是 JSP? Tomcat 功能组件结构 Container 结构分析 Tomcat 请求过程 二、Tomcat部署 1、关闭防火墙和selinux&#xff0c;并将Tomcat所需软件包传到/opt目录下 2、安装JDK 3、设置JDK…

MATLAB 2022b 中设置关闭 MATLAB 之前进行询问

在 MATLAB 2022b 中可以进行设置&#xff0c;在关闭 MATLAB 之前进行询问&#xff0c;防止意外关闭 MATLAB。如图&#xff1a;

《Effective STL》读书笔记(一):容器

容器类型&#xff1a; 标准STL序列容器&#xff1a;vector, string, deque, list标准STL关联容器&#xff1a;set, multiset, map, multimap非标准序列容器slist和rope非标准关联容器&#xff1a;hash_set, hash_multiset, hash_map, hash_multimap标准的非STL容器&#xff1a…

LabVIEW利用纳米结构干电极控制神经肌肉活动

LabVIEW利用纳米结构干电极控制神经肌肉活动 随着人口老龄化&#xff0c;长期护理的必要性变得更加重要&#xff0c;医疗中心的压力开始达到惊人的水平。全球对所有社会和经济部门的认识对于更好地协调卫生和社会服务之间的护理以及为更多的院外治疗提供条件至关重要。 关于医…

SSE 和 WebSocket 应用

SSE 和 WebSocket 应用 一.SSE 和 WebSocket 对比二.SSE 和 WebSocket 调试SpringBoot 下 SSE 应用1.依赖2.启动类3.接口类4.Html 测试5.测试结果 SpringBoot 下 WebSocket 应用1.依赖2.启动类3.WS 切点配置4.WS连接类配置5.WS Html 测试6.测试结果 一.SSE 和 WebSocket 对比 …

数据结构与算法-选择冒泡快排

一&#xff1a;选择排序 场景&#xff1a;找出一个班上身高最高的人你会怎么找&#xff1f;A B C D A B 选择排序的思路和插入排序非常相似&#xff0c;也分已排序和未排序区间。但选择排序每次会从未排序区间中找到最小的元素&#xff0c;将其放到已排序区间的末尾。但是不像插…

浅谈硬件连通性测试方法有哪些

硬件连通性测试是一种用于验证硬件设备之间连接的稳定性和可靠性的测试过程。那么&#xff0c;硬件连通性测试方法有哪些呢?下面&#xff0c;就来看看具体介绍吧! 1、电气测试&#xff1a;电气测试用于检查硬件设备之间的电源和信号连接。这包括使用万用表或示波器测量电压、电…