【MySQL架构图】

MySQL简要架构图如下图所示,引擎层以插件方式集成了不同的存储引擎,它们共用Server层对外提供服务。

   

  • 连接器:用于连接管理,进行身份认证及权限相关的管理。(登录MySQL)
  • 查询缓存区:执行查询语句时,先从缓存区查询。(该功能V8.0之后移除)
  • 分析器:未命中缓存时,对SQL进行词法分析、语法分析。
  • 优化器:按照MySQL认为的最优方案,生成执行计划。
  • 执行器:执行SQL,并从存储引擎返回数据。
  • 存储引擎:存储数据,提供读写接口

【MySQL存储引擎】

V5.5之前MySQL的默认存储引擎为MyISAM(ISAM:Indexed Sequential Access Method,即有索引的顺序访问方法。MyISAM是基于传统的ISAM优化而来)

V5.5之后,MySQL的默认存储引擎便更改为InnoDB,主要是为支持数据库事务安全而设计。

MyISAM vs InnoDB

  • 锁:MyISAM支持表级锁;InnoDB支持行级锁(默认)。因此并发操作时,InnoDB的效率要更高。
  • 性能:MyISAM执行大量select和insert操作时,效率更高;InnoDB执行大量update和insert操作时,效率更高。
  • 外键:MyISAM不支持;InnoDB支持外键。
  • 事务:MyISAM不支持事务操作;InnoDB支持数据库事务。
  • 崩溃后安全恢复:MyISAM不支持;InnoDB支持。
  • MVCC:MVCC:Multi-Version Concurrency Control,基于多版本的并发控制协议。作用于READ COMMITTED 和 REPEATABLE READ 两个隔离级别下,是一种乐观锁,相对基于锁的并发控制更加高效。最基本的原则是:读不加锁,读写不冲突。仅InnoDB支持。

【MySQL索引】

MySQL索引使用的数据结构主要有BTree索引 和 哈希索引 。查询结果为单条时,哈希索引性能更好;其余场景BTree索引更优。

InnoDB存储引擎下,数据文件和索引文件是一体的。表数据文件本身就是按B+Tree组织的一个索引结构,树的叶节点data域保存了完整的数据记录。

【MySQL日志模块】

MySQL的Server层自带有归档日志模块 binlog,每当MySQL执行更新操作时(insert、delete、update),SQL执行记录会记录到该日志中。该日志模块为所有存储引擎所共享。

引擎层中的InnoDB存储引擎还独有一个重做日志模块 redo log,也会用来记录SQL执行更新的操作。该模块可以保证MySQL崩溃后安全恢复,也是InnoDB可以支持事务操作的重要模块。

使用InnoDB执行更新操作的流程:

  分析器 —— 权限验证 —— 执行器 —— 存储引擎 ——记录redo log(prepare状态) —— 记录bin log —— 记录redo log(commit状态)

【MySQL部署模式】

  • 单点模式。常用的部署模式,但无法实现容灾。
  • 主从模式。一主多从,读写分离。解决单点负载瓶颈。主节点宕机,需将从节点切换为主节点来保证服务可用。
    • 主从模式下数据同步过程:
      1. 主节点负责写,并将更改操作记录到归档日志bin log中;
      2. 从节点的IO线程将主的binlog事件(sql语句) 同步本机上并记录在中继日志relay log里;
      3. 从节点的SQL线程按照relay log中记录顺序执行SQL,使得主从数据同步。
  • 集群模式。各节点均可对外提供读写服务,一个节点写的操作会同步到其他所有节点以满足数据一致性。但任意节点宕机不影响集群服务。

参考文献:(文章仅做交流学习,侵权即删!!)

1、https://github.com/Snailclimb/JavaGuide

2、https://blog.csdn.net/AGambler/article/details/84672849

最新文章

  1. css常用技巧
  2. unsatisfied类型的异常
  3. C#_拆箱跟装箱
  4. RobotFramework-关键字
  5. auto printer 自动打字机效果
  6. 基础canvas应用-钟表绘制
  7. J - Borg Maze - poj 3026(BFS+prim)
  8. mysql 5.6密码强度插件使用
  9. [转]PostgreSQL 中文资料汇总
  10. 谈谈一些有趣的CSS题目(十五)-- 谈谈 CSS 关键字 initial、inherit 和 unset
  11. 微信小程序支付开发之申请退款
  12. ant_<target>标签含义与使用
  13. Liblinear and Libsvm-rank训练数据的bash代码
  14. pxe+Kickstart自动装机补充知识点
  15. remote: fatal: could not read Username for 'http://spapa.wicp.net:3000': No such device ors
  16. XCode: 如何添加自定义代码片段
  17. 2017.10.31 Enginer+position+statement
  18. ex:0602-169 遇到不完整或无效的多字节字符,转换失败
  19. Struts1.x 用户登录模块的实现
  20. 程序员之---C语言细节19(来找茬,由/* */ 引起的凝视错误)

热门文章

  1. web应用本质
  2. 1.1两个char类型数据相加后,转化为int类型
  3. Java:关于main方法的10道面试题
  4. SQL Server 阻止了对组件 'Ad Hoc Distributed Queries' 的 STATEMENT'OpenRowset/OpenDatasource' 的访问 (也就是跨数据库访问出错)
  5. 6-MySQL高级-索引
  6. 买不到的数目 /// 结论公式 oj26316
  7. shell 命令 修改文件权限 chmod
  8. JS对象 数组连接 concat() 方法用于连接两个或多个数组。此方法返回一个新数组,不改变原来的数组。 语法 arrayObject.concat(array1,array2,.arrayN)
  9. JS事件 什么是事件?JavaScript 创建动态页面。事件是可以被 JavaScript 侦测到的行为。 网页中的每个元素都可以产生某些可以触发 JavaScript 函数或程序的事件。
  10. Orika JavaBean映射工具探秘