了解MySQL(超详细的MySQL工作原理 体系结构)
- 1.MySQL体系结构
- 2.MySQL内存结构
- 3.MySQL文件结构
- 4.innodb体系结构一、了解MySQL前你需要知道的引擎是什么:MySQL中的数据用各种不同的技术存储在文件(或者内存)中 。这些技术中的每一种技术都使用不同的存储机制、索引技巧、锁定水平并且最终提供广泛的不同的功能和能力 。通过选择不同的技术,你能够获得额外的速度或者功能,从而改善你的应用的整体功能 。当我们理解了引擎这个概念,自然而然就知道引擎层的作用就提供各种不同引擎给你选择,然后用你选出来的引擎去处理sql语句二、MySQL体系结构MySQL 最重要、最与众不同的特性是它的存储引擎架构,这种架构的设计将查询处理 (Query Processing)及其他系统任务(Server Task)和数据的存储/提取相分离 。这种 处理和存储分离的设计可以在使用时根据性能、特性,以及其他需求来选择数据存储 的方式 。
文章插图
由图,可以看出MySQL最上层是连接组件 。下面服务器是由连接池、管理工具和服务、SQL接口、解析器、优化器、缓存、存储引擎、文件系统组成 。
- 用户:进行数据库连接的人 。
- 支持接口:是第三方语言提供和数据库连接的接口,常见的有jdbc,odbc,c的标准api函数等等 。
- 管理工具和服务:系统管理和控制工具,例如备份恢复、Mysql复制、集群等(见图)
- 连接层:提供与用户的连接服务,用于验证登录服务 。
- 服务层:完成大多数的核心服务功能 。有sql接口,解析器parser,优化器optimizer,查询缓存 cache/buffer。
? —>解析器: SQL命令传递到解析器的时候会被解析器验证和解析 。解析器是由Lex和YACC实现的,是一个很长的脚本 。其功能是:
a.将SQL语句分解成数据结构,并将这个结构传递到后续步骤,以后SQL语句的传递和处理就是基于这个结构的 。
? b.如果在分解构成中遇到错误,那么就说明这个sql语句是不合理的 。
? —>优化器:查询优化器,SQL语句在查询之前会使用查询优化器对查询进行优化 。他使用的是“选取-投影-联接”策略进行查询 。举一个例子:
select * from users where uname='admin';
1.这个select查询先根据where语句进行选取,而不是先将表全部查询出来以后再进行uname过滤 。(选取)? 2.这个select查询先根据*进行属性投影,而不是将属性全部取出以后再进行过滤 。(投影)
? 3.将这两个查询条件联接起来生成最终查询结果 。(联接)
? —>缓存器: 查询缓存,如果查询缓存有命中的查询结果,查询语句就可以直接去查询缓存中取数据 。通过LRU算法将数据的冷端溢出,未来得及时刷新到磁盘的数据页,叫脏页 。这个缓存机制是由一系列小缓存组成的 。比如表缓存,记录缓存,key缓存,权限缓存等
? 简而言之,服务层执行过程:sql语句通过sql接口,服务器如果缓存cache有命中查询结果,直接读取数据 。如果没有命中查询结果,由解析器进行sql语句的解析,预处理,经过优化器进行优化后提交给引擎层 。通俗地说—>服务层告诉引擎层要做什么 。
- 引擎层: 提供各种存储引擎,真正的负责MySQL中数据的存储和提取 。常见有innodb myisam。innodb支持全文索引,事务(高并发),行锁,myisam 性能优先 。mysql中查询引擎语句:show engines.通俗地说—>引擎层会转发服务层解析出来的sql语句告诉存储层要做什么(增删改查)并且告诉存储层要以何种方式做(innodb myisam等等) 。
- 存储层: 数据存储层,主要是将数据存储在运行于裸设备的文件系统之上,并完成与存储引擎的交互 。SQL的执行流程:数据库通常不会被单独使用,而是由其它编程语言通过SQL支持接口调用MySQL 。由MySQL处理并返回执行结果 。首先,其它编程语言通过SQL支持接口调用MySQL,MySQL收到请求后,会将该请求暂时放在连接池,并由管理服务与工具进行管理 。当该请求从等待队列进入到处理队列时,管理器会将该请求传给SQL接口,SQL接口接收到请求后,它会将请求进行hash处理并与缓存中的数据进行对比,如果匹配则通过缓存直接返回处理结果;否则,去文件系统查询:由SQL接口传给后面的解析器,解析器会判断SQL语句是否正确,若正确则将其转化为数据结构 。解析器处理完毕后,便将处理后的请求传给优化器控制器,它会产生多种执行计划,最终数据库会选择最优的方案去执行 。确定最优执行计划后,SQL语句交由存储引擎处理,存储引擎将会到文件系统中取得相应的数据,并原路返回 。在我们专业老师的pdf资料里面每一层也讲得很细 见下
推荐阅读
- 如何将MySQL查询性能优化到极致?
- Mysql创建用户和权限管理
- 我对 MySQL 锁、事务、MVCC 的一些认识
- MySQL 中,21 个写 SQL 的好习惯
- 如果mysql磁盘满了,会发生什么?还真被我遇到了
- CentOS7安装mysql8
- 不拆分网线,一根网线实现IPTV和上网单线复用,手把手超详细
- 分享一份大佬的MySQL数据库设计规范,值得收藏
- 几年了,作为一个码农终于把MySQL日记看懂了
- 使用sqoop在MySQL、hadoop、hive间同步数据