热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

MySQL的架构和历史是怎样的

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的架构和历史是怎样的问题的解答就分享到这里了,希望以上内容可以对大家有一定的帮助,如果你还有很多疑惑没有解开,可以关注编程笔记行业资讯频道了解更多相关知识。


推荐阅读
  • 本文介绍了如何使用php限制数据库插入的条数并显示每次插入数据库之间的数据数目,以及避免重复提交的方法。同时还介绍了如何限制某一个数据库用户的并发连接数,以及设置数据库的连接数和连接超时时间的方法。最后提供了一些关于浏览器在线用户数和数据库连接数量比例的参考值。 ... [详细]
  • Oracle分析函数first_value()和last_value()的用法及原理
    本文介绍了Oracle分析函数first_value()和last_value()的用法和原理,以及在查询销售记录日期和部门中的应用。通过示例和解释,详细说明了first_value()和last_value()的功能和不同之处。同时,对于last_value()的结果出现不一样的情况进行了解释,并提供了理解last_value()默认统计范围的方法。该文对于使用Oracle分析函数的开发人员和数据库管理员具有参考价值。 ... [详细]
  • Oracle seg,V$TEMPSEG_USAGE与Oracle排序的关系及使用方法
    本文介绍了Oracle seg,V$TEMPSEG_USAGE与Oracle排序之间的关系,V$TEMPSEG_USAGE是V_$SORT_USAGE的同义词,通过查询dba_objects和dba_synonyms视图可以了解到它们的详细信息。同时,还探讨了V$TEMPSEG_USAGE的使用方法。 ... [详细]
  • 本文详细介绍了SQL日志收缩的方法,包括截断日志和删除不需要的旧日志记录。通过备份日志和使用DBCC SHRINKFILE命令可以实现日志的收缩。同时,还介绍了截断日志的原理和注意事项,包括不能截断事务日志的活动部分和MinLSN的确定方法。通过本文的方法,可以有效减小逻辑日志的大小,提高数据库的性能。 ... [详细]
  • 本文介绍了数据库的存储结构及其重要性,强调了关系数据库范例中将逻辑存储与物理存储分开的必要性。通过逻辑结构和物理结构的分离,可以实现对物理存储的重新组织和数据库的迁移,而应用程序不会察觉到任何更改。文章还展示了Oracle数据库的逻辑结构和物理结构,并介绍了表空间的概念和作用。 ... [详细]
  • 本文介绍了一个在线急等问题解决方法,即如何统计数据库中某个字段下的所有数据,并将结果显示在文本框里。作者提到了自己是一个菜鸟,希望能够得到帮助。作者使用的是ACCESS数据库,并且给出了一个例子,希望得到的结果是560。作者还提到自己已经尝试了使用"select sum(字段2) from 表名"的语句,得到的结果是650,但不知道如何得到560。希望能够得到解决方案。 ... [详细]
  • MyBatis多表查询与动态SQL使用
    本文介绍了MyBatis多表查询与动态SQL的使用方法,包括一对一查询和一对多查询。同时还介绍了动态SQL的使用,包括if标签、trim标签、where标签、set标签和foreach标签的用法。文章还提供了相关的配置信息和示例代码。 ... [详细]
  • 在Oracle11g以前版本中的的DataGuard物理备用数据库,可以以只读的方式打开数据库,但此时MediaRecovery利用日志进行数据同步的过 ... [详细]
  • 本文介绍了Oracle存储过程的基本语法和写法示例,同时还介绍了已命名的系统异常的产生原因。 ... [详细]
  • 安卓select模态框样式改变_微软Office风格的多端(Web、安卓、iOS)组件库——Fabric UI...
    介绍FabricUI是微软开源的一套Office风格的多端组件库,共有三套针对性的组件,分别适用于web、android以及iOS,Fab ... [详细]
  • 开发笔记:select from具体执行相关知识介绍及案例分析
    本文由编程笔记小编整理,主要介绍了select from具体执行相关的知识,包括数据插入、查询最小rowID、查询每个重复名字的最小rowID、删除重复数据等操作,并提供了案例分析。希望对读者有一定的参考价值。 ... [详细]
  • 本文介绍了游标的使用方法,并以一个水果供应商数据库为例进行了说明。首先创建了一个名为fruits的表,包含了水果的id、供应商id、名称和价格等字段。然后使用游标查询了水果的名称和价格,并将结果输出。最后对游标进行了关闭操作。通过本文可以了解到游标在数据库操作中的应用。 ... [详细]
  • 本文讨论了在openwrt-17.01版本中,mt7628设备上初始化启动时eth0的mac地址总是随机生成的问题。每次随机生成的eth0的mac地址都会写到/sys/class/net/eth0/address目录下,而openwrt-17.01原版的SDK会根据随机生成的eth0的mac地址再生成eth0.1、eth0.2等,生成后的mac地址会保存在/etc/config/network下。 ... [详细]
  • Windows7 64位系统安装PLSQL Developer的步骤和注意事项
    本文介绍了在Windows7 64位系统上安装PLSQL Developer的步骤和注意事项。首先下载并安装PLSQL Developer,注意不要安装在默认目录下。然后下载Windows 32位的oracle instant client,并解压到指定路径。最后,按照自己的喜好对解压后的文件进行命名和压缩。 ... [详细]
  • 解决.net项目中未注册“microsoft.ACE.oledb.12.0”提供程序的方法
    在开发.net项目中,通过microsoft.ACE.oledb读取excel文件信息时,报错“未在本地计算机上注册“microsoft.ACE.oledb.12.0”提供程序”。本文提供了解决这个问题的方法,包括错误描述和代码示例。通过注册提供程序和修改连接字符串,可以成功读取excel文件信息。 ... [详细]
author-avatar
精典伏击
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有