MySQL架构和存储引擎
1. MySQL架构
MySQL8.0服务器是由连接池、服务管理⼯具和公共组件、NoSQL接⼝、SQL接⼝、解析器、优化 器、缓存、存储引擎、⽂件系统组成。MySQL还为各种编程语⾔提供了⼀套⽤于外部程序访问服务器 的连接器。整体架构图如下所⽰:
2. 连接层
连接层的作⽤是处理客⼾端的连接,主要学习MySQLServer如何管理连接,包括对可⽤ 连接接⼝的形貌和服务器如何使⽤连接处理线程。
2.1 ⽹络端⼝和连接管理线程
mysql是一个网络服务,通过ip和端标语就可以找到网络上指定的一个mysql服务,程序在启动的时候就可以向操作系统申请一个端口。操作系统只负责转发。通常,一个进程申请一个端口对外提供服务。
2.2 客⼾端连接线程管理
连接管理器线程在接收到每个客⼾端连接后,把请求转发到真正的执⾏线程,每个请求都对应⼀ 个执⾏线程,该线程处理连接的⾝份验证和详细请求。执⾏线程使⽤线程池技术进⾏缓存,当⼀个请 求须要处理时,先从线程池中查找是否有可⽤的线程,假如没有则新创建⼀个,当连接竣事时,假如线程池没有满,则把当前线程放⼊线程池,主要的作⽤是提⾼线程的复⽤,淘汰创建线程造成的系统 开销从⽽提⾼效率。
可以通过以下⼏个系统变量和状态变量控制和监视服务器管理客⼾端连接的线程:
• 系统变量 thread_cache_size 决定了线程池缓存的⼤⼩。默认情况下,服务器在启动时会⾃动 调整这个值,但也可以通过选项⽂件明确指定⼤⼩,值为0时禁⽤缓存,此时为每个新连接创建执 ⾏⼀个线程,并在连接断开时释放;
• 有些复杂的SQL语句在执⾏过程中大概会有深层递归从⽽消耗更多的内存,通过设置 thread_stack=N 调 整线程堆栈⼤⼩;
• 要查看缓存中的线程数以及凌驾缓存数后新创建的线程数,通过状态变量 Threads_cached和Threads_created 查看;
3.3 连接量管理
• 系统变量 max_connections 可以控制服务器允许同时连接的最⼤客⼾端数,当服务器达到 max_connections 指定的连接数时会拒绝全部新的连接请求,同时会增长状态变量 Connection_errors_max_connections 的值;
• mysqld实际上允许 max_connections +1 个客⼾端连接。额外的连接为拥有 CONNECTION_ADMIN 权限的帐⼾(管理员)使⽤,即使普通连接达到了 数量,管理员也可以连接到服务器进⾏管理操作; max_connections 的
• 在摆设为主从复制的环境中,从节点的连接数也管帐⼊ max_connections 中,假如连接达到上 限主从复制将会失败;
• m ax_connections 详细数据和服务器的硬件有关,⽐如可⽤的内存、每个连接消耗的内存,每 个连接的⼯作负载、相应时间、可⽤⽂件形貌符的数量等等。
3. 服务层
数据库服务层是整个数据库服务器的核⼼,主要包括了服务管理和公共组件、NoSQL和SQL接⼝、解 析器、查询优化器和缓存等部分
3.1 服务管理和公共组件
MySQL提供了多种功能服务以满⾜差异使⽤场景下的须要,常⽤的服务如下:
• Backup&Recovery:备份与恢复
• Security:安全,
• Replication:主从复制,
• Cluster:MySQL集群,
• Partitioning:表分区,
• InstanceManager:实例管理,
• Administrator:MySQL管理员,
• MigrationToolkit:迁移⼯具包。
3.2 NoSQL接⼝与SQL接⼝
主要负责接收客⼾端发送的各种SQL语句和命令,并将SQL发送到其他部分,然后把接收到的效果返回 给客⼾端。
3.3 Parser(语法分析器)
语法分析器的主要作⽤是将客⼾端发来的SQL语句中的关键字和⾃界说字段进⾏提取、解析,最 终将SQL语句转换为⼀棵解析树,分析的过程中包含词法分析和语法分析;词法分析,主要是对关键 字进⾏提取,⽐如 select/update/delete/create... ;语法分析,主要判断SQL语句是否满 ⾜语法规则,假如语法错误则异出非常,也就是我们常⻅的ERROR1064(42000):Youhavean error in your SQLsyntax。
3.4 Optimizer(查询优化器)
通过语法校验的SQL语句将进⼊查询优化器处理阶段,查询优化器会将解析树转化为查询计划, ⼀般情况下,⼀条查询可以有许多种执⾏⽅案,查询优化器会根据执⾏计划匹配符合的索引,选择最 佳的执⾏⽅案,终极把确定要执⾏的SQL交给执⾏器调⽤存储引擎API。
TIPS: 优化后的SQL语句在条件查询时大概与程序员写的条件过滤顺序差异,但终极的返回效果⼀致。
3.5 Caches&Buffers(缓存)
MySQL的缓存主要的作⽤是为了提升查询的效率,当服务器接收到⼀个 先辈⼊缓存查询当前SQL语句在缓存中是否存在,缓存以 key 和 select 查询语句时,会 value 的形式存储,key是详细的 SQL语句,value是效果的集合,假如命中缓存,直接返回效果,⽆法命中缓存,则进⼊分析器进⾏正 常查询流程。
这⾥须要说明的是,缓存数据对应的数据在被更新之后将会失效,尤其在写多读少的场景中,缓存会频繁失效与新增,命中率⾮常低,因此MySQL5.6之后服务层缓存功能默认关闭,⽽且在 MySQL8.0中服务层缓存被官⽅删除。
3.6 SQL语句的执⾏流程
5. 存储引擎
作用:对数据举行处理。
存储引擎是处理差异表类型SQL操作的MySQL组件。MySQL服务器采⽤可插拔的存储引擎架构, 在服务器运⾏时可以动态的加载和卸载。
在该层要考虑下面一下几种情况:
5. 存储引擎
存储引擎是处理差异表类型SQL操作的MySQL组件。MySQL服务器采⽤可插拔的存储引擎架构, 在服务器运⾏时可以动态的加载和卸载。
5.1 InnoDB存储引擎
InnoDB是⼀款分身⾼可靠性和⾼性能的通⽤存储引擎。在MySQL8.0中默认的存储引擎是 使⽤CREATE TABLE 语句创建表时,在没有修改默认存储引擎或明确指定其他存储引擎时,将创建一个innoDB表。
仅在测试环境下利用:
和8.0有所差异的是,在MySQL5.X及以前的版本中使⽤⼀个后缀为 .frm 的⼆进制⽂件来记录和形貌表界说的信息 。
5.2 MyISAM存储引擎
mysql5.5之前默认的存储引擎。
使⽤MyISAM存储引擎的表占⽤空间很⼩,但是由于使⽤表级锁定,所以限制了读/写操作的性能,通 常⽤于中⼩型的Web应⽤和数据仓库配置中的只读或主要是读的场景。
MyISAM存储引擎的特性:
相较于之前的innodb存储引擎,外键,事务,hash索引(没有),锁粒度差异,单表的大小限制。
创建MyISAM表 :
在MySQL8.0中 InnoDB 是默认引擎,所以在创建表时须要指定 ENGINE=MyISAM;
5.3 MEMORY存储引擎
使⽤MEMORY存储引擎(以前称为HEAP)创建的表,内容存储在内存中。当服务器由于硬件问题、 断电或其他原因瓦解时数据会丢失,因此这些表仅⽤作临时⼯作区或从其他表中提取数据的只读缓 存。
• 涉及瞬时、⾮关键数据的操作,例如会话管理或须要缓存的数据,当服务器停⽌或重新启动时, MEMORY 表中的数据会丢失;
• ⽤于快速访问和低延时,数据量可以完全放在物理内存中,不使⽤虚拟内存;
• 只读或以读为主的数据访问场景(有限的更新)。
• 使⽤固定⻓度的存储格式,可变⻓度类型,例如 VARCHAR 使⽤固定⻓度存储;
• 不能包含 BLOB 或 TEXT 列;
• ⽀持 AUTO_INCREMENT 的列;
• ⾮ TEMPORARY MEMORY 表在全部客⼾端之间共享;
• ⽀持 HASH 索引(默认)和 BTREE 索引;
• 不⽀持表分区;
• 由于使⽤单线程,在⾼负载的场景下大概会涉及严重的锁竞争,特别是在多个客⼾端并发执⾏更新 操作的情况下,性能并不⼀定会⽐ InnoDB 更快。
每次重启服务器内存表中的数据将被清空,内存表中的数据永远不会写⼊磁盘。
5.4 CSV存储引擎
CSV是逗号分隔值(Comma-SeparatedValues)的缩写,以纯⽂本形式存储表格数据。
5.5 ARCHIVE存储引擎
使⽤ ARCHIVE 存储引擎创建的表,存储⼤量不被索引的数据且占⽤空间很⼩,⼀般⽤于归档数据的存储。
• ⽀持 INSERT , REPLACE 和 SELECT ,但不⽀持 DELETE 和 UPDATE ;
• ⽀持列的 AUTO_INCREMENT 属性,该列可以有唯⼀束缚,且⼿动指定的值不能⼩于该列的最⼤ 值;
• 不⽀持索引,在任何列上尝试建⽴索引都会报错;
• 插⼊时,数据将被压缩, ARCHIVE 引擎使⽤ zlib ⽆损数据压缩; INSERT 语句只是将数据写⼊压缩缓冲区并且根据须要革新到磁盘,当执⾏ SELECT 时会强制革新缓冲区;
• 检索时,按须要进⾏解压缩,不⽀持⾏缓存;
• SELECT操作执⾏全表扫描,找出当前查询的⾏,并读取⾏数;
• 使⽤⾏级锁定
• 不⽀持表分区
5.6 BLACKHOLE存储引擎
BLACKHOLE 存储引擎就像⼀个"⿊洞",接受数据,但不存储数据,检索时总是返回⼀个空效果
5.7 MERGE存储引擎
MERGE存储引擎,也称为MRG_MyISAM引擎,允许MySQLDBA或开发⼈员在逻辑大将⼀系列相 同的MyISAM表分组,并将它们作为⼀个对象引⽤。适⽤于VLDB(VeryLargeDataBases)环境,如数 据仓库。这⾥的雷同表⽰全部表中的列都有雷同的数据类型和索引信息。⽰意图如下:
关于MERGE表的替换⽅案可以使⽤表分区,可以⽀持主键索引,唯⼀索引,全⽂索引等,
5.8 FEDERATED存储引擎
可以简单的实现分布式;
5.9 差异存储引擎的特性
ps:仅用于本身复习!!!
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |