mysql 的逻辑架构 与 存储引擎的介绍
mysql 的逻辑架构分为三层:
最上层的服务大多数基于网络的客户端、服务器的工具或者服务都有类似的架构,比如连接处理,授权认证、安全等
第二层架构:mysql的核心服务功能都在这一层,包括查询解析,分析,优化,缓存以及所有的内置函数,所有跨存储引擎的功能都在这一层实现:存储过程,触发器、视图
第三层:包含存储引擎。负责数据的存储和提取,innoDB是个例外,它会解析外键定义,因为mysql服务器本身没有实现该功能
连接管理与安全性:
当客户端连接到mysql服务器是,服务器需要对其进行认证,认证基于用户名,原始主机信息和密码,一旦客户端连接成功,服务器 会继续验证该客户端是否具有执行某个特定查询的权限
优化与执行:
mysql会解析查询,并创建内部数据结构(解析树),然后对其进行各种优化,包括重写查询,决定表的读取顺序,以及选择合适的索引,用户可以通过特殊的关键字提示优化器,影响他的决策过程,也可以请求优化器解释优化过程的各个因素,使yoghurt可以知道服务器是如何进行优化决策的,并提供一个参考基准,便于用户重构查询和修改相关配置,优化查询效率
存储引擎对于优化查询时有影响的
对于select语句,在解析查询之前,服务器会先检查缓存,如果能找到对应的查询,服务器就不会再执行查询解析,优化和执行的整个过程,而是直接返回查询结果
并发控制:
只要有多个查询需要在同一时刻修改数据,都会产生并发控制的问题。
如果应用锁可以保证数据的完整性,不被破坏,但是并不支持并发处理。
两个层面的并发控制:服务器层和存储引擎层
读写锁:通过实现一个由两种类型的锁组成的锁系统来解决问题,也称作共享锁和排它锁或者读锁和写锁
读锁是共享的,互相不阻塞的,而写锁则是排他的,
锁粒度:一种提高共享资源并发性的方式就是让锁定对象更有选择性,尽量只锁定需要修改的部分数据,而不是所有资源。更理想的方式是,是对会修改的数据片进行精确的锁定,
在任何时候,在给定的资源上,锁定的数据量越少,则系统的并发程度越高,只要相互之间不发生冲突即可
所谓的锁策略,就是在锁的开销和数据的安全性之间寻求平衡,大多数商业数据库系统没有提供能多的选择,一般都是在表上施加行级锁,而mysql则提供了多种选择,每种mysql存储引擎都可以实现自己的锁策略和锁粒度
表锁:
锁开销最小的策略,会锁定整张表,写锁也比读锁优先级更高,一个写锁请求可能会被插入到读锁队列的前面
行级锁:
最大程度地支持并发处理,同时也带来最大的锁开销,行级锁只在存储引擎层实现,服务器层没有实现,所有的引擎都以自己的方式实现了锁
事务:ACID
atomicity consistency isolation durability
每种存储引擎实现的隔离级别不尽相同
四种隔离级别:innodb引擎支持所有隔离级别
read uncommitted:未提交读,事务可以读取未提交的数据,脏读(很少使用)
read committed:提交读,大多数数据库系统的默认隔离级别都是read committed,但mysql不是,这和个级别有时候也叫做不可重复读,两次执行同样的查询可能会得到不一样的结果
repeatable read:可重复读,是mysql的默认事务隔离级别,该级别保证了在同一个事务中多次读取同样的记录结果是一致的。但是无法解决另外一个幻读问题。幻读指的是当某个事务在读取某个范围内的记录时,另外一个事务又在该范围内插入了新的记录,档之前的事务再次读取该范围的记录时,会产生幻行。
innodb和xtradb存储引擎通过多版本并发控制解决了幻读的问题。
serializable:可串行化,最高的隔离级别,强制事务串行执行,避免幻读问题。也很少用。
事务日志;
帮助提高事务的效率,使用事务日志,存储引擎在修改表的数据时只需要修改其内存拷贝,再把该修改行为记录到持久在硬盘上的事务日志中,而不用每次都将修改的数据本身持久到磁盘,事务日志采用的追加的方式,因此写日志的操作时磁盘上一小块区域内的顺序I/O操作,而不像随机I/O需要在磁盘的多个地方移动磁头,所以采用事务日志的方式相对来说快的多
修改数据需要写两次磁盘
mysql中的事务
两种事务型的存储引擎:innodb和NDB Cluster
SET AUTOCOMMIT = 0 ;设置禁用自动提交模式,修改AUTOCOMMIT对本身就是非事务型的表,不会有任何影响。
有些命令在执行之前会强制执行commit提交当前的活动事务。
SET TRANSACTION ISOLATION LEVEL read committed;设置隔离级别。可以在配置文件中设置整个数据库的隔离级别,也可以只改变当前会话的隔离级别
在事务中混合使用存储引擎
mysql服务器层不管理事务,事务是由下层的存储引擎实现的,所以在同一个事务中,使用多种存储引擎是不可靠的
MVCC:多版本并发控制
innodb的mvcc:通过在每行记录后面保存两个隐藏的列来实现的,一个列保存了行的创建时间,一个保存行的过期时间(删除时间),存储的并不是实际的时间值,而是系统版本号。每开始一个新的事务,系统版本号都会自动递增。
不同的存储引擎保存数据和索引的方式是不同的,但表的定义则是在mysql服务层统一处理的
SHOW TABLE STATUS LIKE 'user';显示相关表信息
innodb是mysql的默认事务型引擎,被设计用来处理大量的短期事务,短期事务大部分情况是正常提交的,很少会被回滚,
innodb
innodb基于聚簇索引建立,innodb的索引结构和mysql的其他存储引擎有很大的不同,聚簇索引对主键查询有很高的性能,不过它的二级索引中必须包含主键列,若表上的索引较多的话,主键应当尽可能小。存储格式是平台独立的,可移植。崩溃后可安全恢复
myisam存储引擎;崩溃后无法恢复。支持数据修复,支持全文索引,基于分词创建的索引,对整张表加锁,写锁具有排他性,读锁共享,不能很好的支持高并发
Memory引擎:基于内存,所以不保存数据 ,支持hash索引,是表级锁,并发写入性能较低, 应用场景:用于保存数据分析中产生 的中间数据,用于查找或者映射表,MySQL在执行查询的过程中需要使用临时表来保存中间结果,内部使用的临时表就是memory表。
NDB cluster引擎:
mysql服务器、NDB集群存储引擎,以及分布式的,share-nothing的,容灾的,高可用的NDB数据库的组合,被称为mysql集群。
第三方存储引擎:
OLTP:XtraDB是基于innodb引擎的一个改进版本,可以作为innodb的一个完全的替代产品。
另外还有一些和innodb非常类似的OLTP类存储引擎,比如都支持acid事务和mvcc,其中一个就是pbxt。对固态存储ssd提供了适当的支持。
tokudb引擎使用了一种新的叫做分形树的索引数据结构,该结构是缓存无关的,因此即使其大小超过内存性能也不会下降,是一种大数据存储引擎,因为拥有很高的压缩比,可以在很大的数据量上创建大量索引 。
面向列的存储引擎:
mysql默认是面向行的,服务器的查询也是以行为单位处理的,
infobright是最有名的面向列的存储引擎,在非常的数据量(数十TB)时,该引擎工作良好。视为数据分析和数据仓库应用设计的。数据高度压缩,按照块进行排序,每个块都对应一组元数据。访问元数据即可决定是否跳过该块,该引擎不支持缩影。
参考文献《高性能mysql》
mysql 的逻辑架构 与 存储引擎的介绍的更多相关文章
- mysql 开发基础系列10 存储引擎 InnoDB 介绍
一. 概述: InnoDB存储引擎提供了具有提交,回滚,和崩溃恢复能力的事务安全,对比MYISAM 的存储引擎,InnoDB写的处理效率差一些并且会占用更多的磁盘空间以保留数据和索引.它的特点有如下: ...
- MySQL数据库的逻辑架构和存储引擎
和其他数据库相比,MySQL数据库的架构与众不同,它的架构可以在多种不同的场景中应用并发挥良好的作用:主要体现在存储引擎上的架构上,插件式的存储引擎架构将查询处理和其他的系统任务以及数据存储提取相分离 ...
- MySQL(逻辑分层,存储引擎,sql优化,索引优化以及底层实现(B+Tree))
一 , 逻辑分层 连接层:连接与线程处理,这一层并不是MySQL独有,一般的基于C/S架构的都有类似组件,比如连接处理.授权认证.安全等. 服务层:包括缓存查询.解析器.优化器,这一部分是MySQL核 ...
- mysql的体系架构和存储引擎
定义数据库和实例 数据库:物理操作系统的文件或其他形式文件类型的集合.在mysql数据库中,数据库文件可以是frm.MYD.MYI.ibd结尾的文件. 实例:MySQL数据库由后台线程以及一个共享内存 ...
- MySQL中四种常用存储引擎的介绍
MySQL常用的四种引擎的介绍 (1):MyISAM存储引擎: 不支持事务.也不支持外键,优势是访问速度快,对事务完整性没有 要求或者以select,insert为主的应用基本上可以用这个引擎来创建表 ...
- mysql 开发基础系列9 存储引擎 MyISAM 介绍
MyISAM是mysql 默认存储引擎,它不支持事务,外键.但访问速度快,对事务完整性没有要求或者以select,insert 为主的应用基本上都可以使用这个引擎.每个MyISAM在磁盘上存储成3个文 ...
- 简单描述MySQL常用引擎的特点及MySQL的逻辑架构
目录 表的分类数据库引擎? 首先得说说mysql的逻辑架构,它整体分为3层: 常用引擎: 补充知识点: 表的分类数据库引擎? 引擎是什么? 引擎就是一个系统最核心的部分,比如汽车的发动机,人的心脏 数 ...
- 《MySQL技术内幕:InnoDB存储引擎(第2版)》书摘
MySQL技术内幕:InnoDB存储引擎(第2版) 姜承尧 第1章 MySQL体系结构和存储引擎 >> 在上述例子中使用了mysqld_safe命令来启动数据库,当然启动MySQL实例的方 ...
- MySql(十一):MySQL性能调优——常用存储引擎优化
一.前言 MySQL 提供的非常丰富的存储引擎种类供大家选择,有多种选择固然是好事,但是需要我们理解掌握的知识也会增加很多.本章将介绍最为常用的两种存储引擎进行针对性的优化建议. 二.MyISAM存储 ...
随机推荐
- vue中异步请求渲染问题(swiper不轮播)(在开发过程中遇到过什么问题、踩过的坑)
问题描述: 用vue封装一个swiper组件的时候,发现轮播图不能轮播了. 原因: 异步请求的时间远大于生命周期执行的时间,mounted初始化DOM时数据未返回,渲染数据是空数组,导致轮播图的容器层 ...
- struts2.xml 中result type属性说明
chain 用来处理Action链,被跳转的action中仍能获取上个页面的值,如request信息. com.opensymphony.xwork2.Acti ...
- 使用 Jest 和 Supertest 进行接口端点测试
如何创建测试是一件困难的事.网络上有许多关于测试的文章,却从来不告诉你他们是如何开始创建测试的. 所以,今天我将分享我在实际工作中是如何从头开始创建测试的.希望能够对你提供一些灵感. 目录: 使用 E ...
- JVM调优前戏之JDK命令行工具---jstack
在JDK的命令行中,一般开发人员最耳熟能详的肯定就是java,javac,javap等常用命令,不过在jdk/bin下还有许多其他的命令行工具,它们被用来监测JVM运行时的状态,下面我们来详细解读一下 ...
- 使用Oracle Logminer同步Demo
使用Oracle Logminer同步Demo 1 Demo介绍 1.1 Demo设想 前面介绍了Oracle LogMiner配置使用以及使用LogMiner进行解析日志文件性能,在这篇文章中将利用 ...
- 天际PRO-CR16 改装方案
本人现有红色CR16一台,宿舍在7楼,最近找了一份长期兼职,不想挤公交,想骑车去,经常上下楼很是痛苦,琢磨了两天两夜,终于出来第一套小该方案,有不合理地方,或者有个好的零件选择,请各位指点.本人不胜感 ...
- sitecore-多变量测试与A / B测试概念论述
sitecore-多变量检验和A / B检验的区别 A / B测试和多变量测试有什么区别?让我们来看看这些测试方法的方法,常见用途,优点和局限性. sitecore中A / B测试 A / B测试(您 ...
- AngularJS 的全选、反选实现
目录 AngularJS 的全选.反选实现 一.需求 二.思路 三.实现 AngularJS 的全选.反选实现 一.需求 要使用 AngularJS 实现 checkbox 的全选.反选. 其中所有项 ...
- scala 函数式编程之集合操作
Scala的集合体系结构 // Scala中的集合体系主要包括:Iterable.Seq.Set.Map.其中Iterable是所有集合trait的根trai.这个结构与Java的集合体系非常相似. ...
- kubernetes 1.15 有哪些让人眼前一亮的新特性?
原文链接:kubernetes 1.15 有哪些让人眼前一亮的新特性? 2019 年 6 月 20 日,Kubernetes 重磅发布了 1.15 版本,不过笔者忙到现在才有空认真来看一下到底更新了哪 ...