返回顶部
首页 > 资讯 > 数据库 >MySQL的架构和历史是怎样的
  • 112
分享到

MySQL的架构和历史是怎样的

2024-04-02 19:04:59 112人浏览 八月长安
摘要

Mysql的架构和历史是怎样的,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。mysql架构和历史1.处理和存储分离的设计Mysql最重要,

Mysql架构和历史是怎样的,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。

mysql架构和历史

1.处理和存储分离的设计

Mysql最重要,最与众不同的特性是它的可插拔式存储引擎架构(将查询处理,系统任务,数据的存储,提取相分离)。

2.架构:

层级作用备注
连接层连接处理,授权认证等RDMS共有设计
服务层查询解析,缓存,分析优化,内置函数,跨引擎功能MySQL核心服务与功能,服务层未设计外键
引擎层负责数据存储与提取底层函数,不会解析SQL,不同引擎直接不在此层级互相通信,仅响应来自上层的请求。处理外键

3.优化与执行

服务层解析查询,创建解析树,然后进行重写查询,决定表的读取顺序,选择合适的索引等。在此步,用户可以通过hint关键字或者force index影响优化器的决策,也可以通过explain命令查看优化器如何优化决策。

优化器不关心表使用什么引擎,但存储引擎对优化查询是有影响的。

4.

读锁是共享的,相互不阻塞。

写锁是排他的,相互阻塞,在给定的时间内,同一行数据,只能有一个用户正在进行写入。

大多数时候,MySQL锁的内部管理都是透明的。

在给定的资源上,锁定的数据量越少,则系统的并发读越高。

加锁需要消耗资源,如果系统花费大量时间来管理锁,而不是存取数据,则系统的性能可能会因此收到影响。

一般会在锁的开销和数据的安全性之间寻求平衡,即在表上施加行级锁。

每种MySQL引擎都可以实现自己的锁倾向和锁粒度。

写锁比读锁有更高的优先级,并发时,写锁请求可能会被插入到队列的最前端,但读锁最多只能排在其他读锁的最前端。

服务层会对涉及到整个表的内容的更改使用表级锁,引擎层的锁机制被忽略。

行级锁只在存储引擎层实现。

InnoDB采用两段锁定协议,在事务执行过程中,随时都可以执行锁定,但只有在整个事务提交或者回滚时才会同一时间释放该事务占有的所有锁。‘隐式锁’

服务层可以使用LOCK TABLE或者UNLOCK TABLE,但可能会和事务产生相互影响产生不可预料的后果,尽量不要在业务进行时中使用。

5.事务

事务就是一组原子性的SQL查询,一组独立的工作单元。事务内的语句要么全部执行完,要么全部失败。

一个完备的数据库系统需要满足ACID特征:

Atomictiy 原子性:一个事务视为不可分割的最小单元。

Consistency 一致性: 数据库总是从一个一致性的状态转换到另一个一致性的状态。

    Isolation 隔离性: 一个事务所做的修改在最终提交之前,对其事务是不可见的。

Durability 持久性:一旦提交,永久保存,不受系统崩溃影响。

一个实现了ACID特性的数据库,需要更强的硬件。

即使存储引擎不支持事务,但还可以通过lock table来提供部分ACID特性。

非事务型的表只能自动提交。

事务型的表在执行DDL操作或者lock table时会强行commit当前的活动事务

隔离级别(ANSI)

READ UNCOMMITED(未提交读):事务中未提交的修改也会被其他事务读到,’脏读‘,性能不会好太多。

READ COMMITED(提交读):事务中提交后的修改会被其他事务读到,但会造成不可重复读。MSSQL,oracle

READ REPEATABLE(可重复读):事务中多次读取同一条数据值相同,但新插入的不算,即主键范围读可能不一致,'幻读',MySQL默认级别。

SEARIALIZE(串行):取消并行,完全串行,悲观锁。

可以通过set [session] transaction isolation level [RU|RC|RR|SX]设置隔离级别,全局性设置在下一个事务开始时生效,会话级设置只对当前事务有效

隔离级别脏读可能性不可重复读幻读可能性加锁读
RUYYYN
RCNYYN
RRNNYN
SXNNNY

死锁

两个或以上的事务争用同一组资源,并请求锁定对方占用的资源。

处理办法:完备的RDMS包含了死锁检测与死锁超时机制。

InnoDB:将持有最少行级X锁的事务进行回滚。

死锁在事务型RDMS中是无法避免的,死锁发生后,只有部分或者完全回滚其中一个事务才能打破窘境。

事务日志(redo)

可以提高事务的效率,存储引擎在修改表的数据时只需要修改其内存拷贝,再批量地把修改的行为记录到硬盘上的事务日志文件中。

事务日志采用了正向追加的方式,保证了写入时的 顺序IO。批量记录修改的行为时,事务日志持久后,可以在后台将内存中的数据慢慢刷回磁盘

6.多版本并发控制(mvcC)

MVCC是行级锁的一个变种,在很多情况下避免了加锁的操作,且只在RR和RC隔离级别下工作。

MVCC是通过保存数据行在某个时间点的快照来实现的。

根据事务开始时间的不同,每个事务对同一张表,同一时刻看到的数据可能是不一样的。

InnoDB的MVCC,是通过在每个记录(包括已经存入undo中的记录)后面保存两个隐藏的版本号来实现的。即:该数据创建时的系统版本号和该数据失效时的系统版本号。

其他事务:

SELECT时:只查找比当前事务创建更早的行(极端情况下,在此事务中对此行进行了修改或创建,即读取本事务中被修改后此行的数据)。

INSERT时:为新插入的此行保存本事务版本的版本号作为此行的创建版本号。同时若在此事务中不在对此行进行修改,则行过期版本号留空

DELETE时:将本事务的版本号赋给被删除行的失效版本号

UPDATE时:将本事务的版本号赋给被修改行的失效版本号,同时插入被修改后的数据,同时把本事务的版本号付给新插入的修改后的数据的创建版本号。

保留这两个额外版本号,可以使大多数读操作都不用加S锁,但这些多余的行会占用undo空间。建议将undo从共享表空间中独立出来,并减小事务长度。

7.存储引擎

不同引擎保存数据和索引的方式是不同的,但表的定义是在服务层统一处理的。

通过show table status显示表的相关信息

属性属性值说明
Name:user表名
Engine:InnoDB存储引擎
Row_fORMat:Dynamic行格式,变长行
Rows3对应InnoDB,估计的行数值
Avg_row_length5461平均每行字节数
Data_length16384表数据字节数
Max_data_length0表最大字节数(InnoDB无限制)
Index_length0非主键索引占用字节数
Data_free4194304已分配但未使用的字节数
Auto_incrementNULL下个自增值的起始点
Create_time2018-01-24 20:02:01创建时间
Update_timeNULL最后一次的更新时间
Check_timeNULLCHECK TABLE命令使用的时间
Collationutf8_bin该表默认字符集与排序规则
ChecksumNULL(若启用校验)校验和
Create_optionsstats_persistent=0建表时的其他非默认选项
CommentUsers and privileges表的备注

InnoDB引擎被设计用来处理大量短期事务(大部分情况下正常提交),正常情况下默认使用InnoDB引擎,MySQL8.0版本,将mysql库中的表也从MyISAM更换为InnoDB引擎。

InnoDB引擎一直朝着可测量性,可扩展性,可配置化,性能,更多新特性的方向演进。

InnoDB引擎概览

InnoDB的数据存储在表空间中,推荐使用独立表空间,即将各个表的数据和索引放在单独的文件中。

InnoDB使用MVCC来支持高并发,并且实现了四个标准的隔离级别。默认隔离级别为可重复读RR,并且通过间隙锁的机制解决了范围读可能因为新插入值导致出现幻读的问题。

间隙锁通过在本来锁定查询设计的行同事,还会对索引中的间隙进行锁定,防止插入新的行。

InnoDB表是基于聚簇索引建立的,即索引组织表。这种设计,使得对主键的进行的查询效率很高。其二级索引,即非聚集索引(普通索引,非主键索引)是通过链接的方式指向其对应的主键位置,即二级索引中包含了主键列。这就会产生一个主键列长度很大,其他索引的大小也会同样很大的问题。这个特性要求我们主键列的最大长度尽量减小。

InnoDB引擎表的文件存储格式是独立的,某种程度上可以跨平台使用。

InnoDB的显著优化特点:从磁盘读取数据时的可预测性读,引入了能够在内存中创建Hash索引来加速读操作的自适应哈希索引(adaptive hash index),能够加速插入操作的插入缓冲区(insert buffer,对非主键非唯一性索引进行缓存,每10s合并到非主键索引中)。

InnoDB引擎的表支持热物理备份(非逻辑备份成sql文件)即XtraBackup或者官方的Enterprise Backup

有趣的CSV引擎

可以将excel文件另存为CSV格式,放入MySQL数据目录下,即可在MySQL中打开使用。

慢慢弃用的引擎:

Federated引擎,本来设计用于建立Oracle,SQL Server到MySQL的数据联系纽带,后被用于创建跨实例连接(类似于SQL server中的同义词或者链接服务器),但经常带来问题,默认禁用,MariaDB提供了一个改进版的FederatedX。

Memory引擎,数据只存在内存中,重启后表结构留存,但数据会全部丢失。支持HASH索引,表级锁,并发低,行长度固定。

第三方常用存储引擎:

XtraDB引擎,Percona公司基于InnoDB引擎的改进版本

TokuDB引擎,基于分形树索引的引擎,具有较高的压缩比,可以在很大的数据量上创建索引。

Infobright引擎,列组织的引擎,面向大数据设计。

更改表的存储引擎:alter table t1 engine = InnoDB; 执行过程中会创建相同表结构不同引擎的一张新表,然后按行将数据从原表读入到新表中,会进行锁表,消耗大量系统IO,尽量不要在业务高峰期进行,或者使用pt-online-schema-change的工具进行在线修改。

关于MySQL的架构和历史是怎样的问题的解答就分享到这里了,希望以上内容可以对大家有一定的帮助,如果你还有很多疑惑没有解开,可以关注编程网数据库频道了解更多相关知识。

您可能感兴趣的文档:

--结束END--

本文标题: MySQL的架构和历史是怎样的

本文链接: https://lsjlt.com/news/61331.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • MySQL的架构和历史是怎样的
    MySQL的架构和历史是怎样的,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。MySQL架构和历史1.处理和存储分离的设计MySQL最重要,...
    99+
    2024-04-02
  • CentOS的简介与历史是怎样的
    这期内容当中小编将会给大家带来有关CentOS的简介与历史是怎样的,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。CentOS 是 Community Enterprise Operating System...
    99+
    2023-06-15
  • 怎么样查看mysql的命令历史
    本文主要给大家介绍怎么样查看mysql的命令历史,文章内容都是笔者用心摘选和编辑的,具有一定的针对性,对大家的参考意义还是比较大的,下面跟笔者一起了解下怎么样查看mysql的命令历史吧。有时,我们在linu...
    99+
    2024-04-02
  • MySQL架构体系是怎样的
    本篇内容主要讲解“MySQL架构体系是怎样的”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“MySQL架构体系是怎样的”吧!一 : 数据库和数据库实例 在MySQL的学习研究中,存在两个...
    99+
    2023-06-05
  • MySQL的逻辑架构是怎样的
    今天就跟大家聊聊有关MySQL的逻辑架构是怎样的,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。 第一层,服务层(为客户端服务):为请求做连接处理,...
    99+
    2024-04-02
  • JavaScript 25年来的历史进程是怎样的
    这期内容当中小编将会给大家带来有关JavaScript 25年来的历史进程是怎样的,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。JavaScript于25年前(1995年...
    99+
    2024-04-02
  • Android架构是怎样的
    本篇内容介绍了“Android架构是怎样的”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!Android 图解Android 操作系统是一个软...
    99+
    2023-06-27
  • SDN架构是怎样的
    这篇文章主要介绍了SDN架构是怎样的的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇SDN架构是怎样的文章都会有所收获,下面我们一起来看看吧。SDN是一种将网络控制功能与转发功能分离、实现控制可编程的新兴网络架构...
    99+
    2023-06-27
  • JavaScript引入模块的历史简介是怎样的
    JavaScript引入模块的历史简介是怎样的,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。随着我们的应用越来越大,我们想要将...
    99+
    2024-04-02
  • Zabbix的架构是怎样的
    Zabbix的架构是客户端-服务器架构,包括以下组件: Zabbix Server:负责接收来自监控对象的数据、存储监控数据、执...
    99+
    2024-04-02
  • Kylin的架构是怎样的
    Kylin是一个开源的分布式OLAP(联机分析处理)引擎,主要用于大规模数据集的多维数据分析和查询。它的架构主要包含以下几个组件: ...
    99+
    2024-04-02
  • Atlas的架构是怎样的
    Atlas的架构是一个分布式系统,主要由以下几个组件构成: 数据存储层:Atlas使用Apache HBase作为数据存储层,用...
    99+
    2024-04-02
  • Teradata的架构是怎样的
    Teradata的架构是一个多层次的结构,包括以下几个主要组件: Parsing Engine (PE):负责接收和解析SQL查询...
    99+
    2024-03-11
    Teradata
  • kubernetes架构是怎么样的
    小编给大家分享一下kubernetes架构是怎么样的,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!一:整体架构二:架构模块说明以上是“kubernetes架构是怎...
    99+
    2023-06-04
  • Jenkins中的构建历史怎么查看
    在Jenkins中,您可以通过以下步骤查看构建历史: 登录到Jenkins控制台。 在左侧菜单中,点击“构建历史”选项。 ...
    99+
    2024-03-04
    Jenkins
  • PHP 函数参数类型的演变历史是怎样的?
    php 函数参数类型历史演变:php 4 之前:松散类型,无类型提示或强制执行。php 4:引入类型提示,但仅作为注释。php 5:增强了类型提示,引入了严格模式,但仍然支持松散类型。p...
    99+
    2024-04-10
    php 函数参数类型
  • PHP 函数参数类型的演变历史是怎样的?
    php 函数参数类型历史演变:php 4 之前:松散类型,无类型提示或强制执行。php 4:引入类型提示,但仅作为注释。php 5:增强了类型提示,引入了严格模式,但仍然支持松散类型。p...
    99+
    2024-04-10
    php 函数参数类型
  • MySQL高可用架构的PXC实践是怎样的
    这篇文章给大家介绍MySQL高可用架构的PXC实践是怎样的,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。1、PXC简介    官方介绍: &nb...
    99+
    2024-04-02
  • MySQL数据库基础架构是怎么样的
    这篇文章给大家分享的是有关MySQL数据库基础架构是怎么样的的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。1.Application LayerMySQL的应用层提供各种用户对数...
    99+
    2024-04-02
  • Mysql重装经历是怎样的
    本篇文章给大家分享的是有关Mysql重装经历是怎样的,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。   昨天,突然之间服务器上的就...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作