当前位置: 首页 > news >正文

mysql进阶(三)

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:仅用于自己复习!!!

相关文章:

  • 【CSS 】Class Variance Authority CSS 类名管理工具库
  • JVM与性能调优详解
  • 香港电讯CE2.0网络全面升级,100G服务支援企业关键应用
  • Unity InputField + ScrollRect实现微信聊天输入框功能
  • unity学习64,第3个小游戏:一个2D跑酷游戏
  • 如何用更少的内存训练你的PyTorch模型?深度学习GPU内存优化策略总结
  • Linux 上离线安装 python3
  • 哪些培训课程适合学习PostgreSQL中级认证知识?
  • 前端Vue3面试题
  • blender 坐标系 金属度
  • 基于多目标向日葵优化算法(Multi-objective Sunflower Optimization,MOSFO)的移动机器人路径规划研究,MATLAB代码
  • 小程序路径复制
  • 18年老牌软件,完美解锁pro!
  • Java 导出大数据到 Excel 表格
  • DeepSeek group-limited expert routing和负载均衡
  • Secret Cow Code S
  • PS内发光、外发光
  • 关于读写锁:有个线程在读,能写吗?有个线程在写,能读吗?
  • python 同一行显示多条语句
  • 探秘Transformer系列之(9)--- 位置编码分类
  • 上海位居全球40城科技传播能力第六名
  • 广西桂林、百色、河池等地表态:全力配合中央对蓝天立的审查调查
  • 推开“房间”的门:一部“生命存在的舞台” 史
  • 菲律宾中期选举结果揭晓,马科斯与杜特尔特家族重回“权力的游戏”
  • 夜读丨什么样的前程值得把春天错过
  • 时隔三年,俄乌直接谈判重启