时间:2021-07-01 10:21:17 帮助过:59人阅读
MySQL是由SQL接口,解析器,优化器,缓存,存储引擎组成的。
MySQL逻辑架构整体分为四层:
(1)最上层:连接层
最上层是一些客户端和连接服务,包含本地的sock通信和大多数基于客户端/服务端工具实现的类似于tcp/ip的通信,主要完成一些类似于连接处理、授权认证及相关的安全方案,
在该层上引用了线程池的概念,为通过认证安全接入的客户端提供线程。同样在该层上可以实现基于ssl的安全链接。服务器也会为安全接入的每个客户端验证它所具有的操作权限。
(2)第二层:SQL服务层
第二层架构主要完成大多数的核心服务功能。如sql接口,并完成缓存的查询。sql的分析和优化 以及部分内置函数的执行。
所有跨存储引擎的功能也在这一层实现,如过程,函数等。在该层,服务器会解析查询并创建相应的内部解析树,并对其完成相应的优化如确定查询表的顺序,是否利用索引等。
最后生成相应的执行操作。如select语句,服务器还会查询内部的缓存。如果缓存空间足够大,这样就解决大量读操作的环境中能够很好的提升系统的性能。
(3)第三层:存储引擎层
存储引擎真正的负责MySQL中数据的存储和提取,服务器通过API与存储引擎进行通信,不同的存储引擎具有的功能不同,这样可以根据自己的实际需进行选取。
(4)第四层:数据存储层
主要是将数据存储在运行于裸设备的文件系统之上,并完成于存储引擎的交互。
与其他编程语言中的sql 语句进行交互,如php、java等。
系统管理和控制工具。
管理缓冲用户连接,线程处理等需要缓存的需求。
4、SQL Interface (SQL接口)
接受用户的SQL命令,并且返回用户需要查询的结果。比如select from就是调用SQL Interface。
SQL命令传递到解析器的时候会被解析器验证和解析。
主要功能:
(1)将SQL语句分解成数据结构,并将这个结构传递到后续步骤,后面SQL语句的传递和处理就是基于这个结构的;
(2)如果在分解构成中遇到错误,那么就说明这个sql语句是不合理的,语句将不会继续执行下去。
6、Optimizer (查询优化器)
SQL语句在查询之前会使用查询优化器对查询进行优化(产生多种执行计划,最终数据库会选择最优化的方案去执行,尽快返会结果) 他使用的是“选取-投影-联接”策略进行查询。
用一个例子就可以理解: select uid,name from user where gender = 1;
这个select 查询先根据where 语句进行选取,而不是先将表全部查询出来以后再进行gender过滤,
这个select查询先根据uid和name进行属性投影,而不是将属性全部取出以后再进行过滤,将这两个查询条件联接起来生成最终查询结果。
7、Cache和Buffer (查询缓存)
如果查询缓存有命中的查询结果,查询语句就可以直接去查询缓存中取数据。这个缓存机制是由一系列小缓存组成的。比如表缓存,记录缓存,key缓存,权限缓存等。
9、Engine (存储引擎)
存储引擎是MySql中具体的与文件打交道的子系统。也是Mysql最具有特色的一个地方。
Mysql的存储引擎是插件式的。它根据MySql AB公司提供的文件访问层的一个抽象接口来定制一种文件访问机制(这种访问机制就叫存储引擎)。
MySQL查询缓存保存查询返回的完整结构。当查询命中该缓存时,MySQL会立刻返回结果,跳过了解析、优化和执行阶段。
查询缓存系统会跟踪查询中涉及的每个表,如果这些表发生了变化,那么和这个表相关的所有缓存数据都将失效。
MySQL将缓存存放在一个引用表中,通过一个哈希值引用,这个哈希值包括了以下因素,即查询本身、当前要查询的数据库、客户端协议的版本等一些其他可能影响返回结果的信息。
可以看到相关参数设置是否数据缓存:
query_cache_type:0-不启用查询缓存;1-启用,2-启用,默认值为0;
query_cache_size:设置缓存区总大小,允许设置query_cache_size的值最小为40K,默认1M,推荐设置为:64M/128M;
query_cache_limit:限制缓存区最大能缓存的单条查询记录集大小,默认设置为1M
query_cache_type为1时,只要符合查询缓存的要求,客户端的查询语句和记录集都可以缓存起来,如果SQL中加上 SQL_NO_CACHE将不缓存;
query_cache_type为2时,只要SQL中添加了参数:SQL_CACHE,且符合查询缓存的要求,客户端的查询语句和记录集,则可以缓存起来。
设置选项query_cache_type = 1 ,同时设置query_cache_size = 67108864;
注:query_cache_size的值设置在100MB以内即可。在MySQL里查询缓存是由一个全局锁在控制,每次更新查询缓存的内存块都需要进行锁定。
设置选项query_cache_type = 0,同时设置query_cache_size = 0。
用于频繁提交同一个语句,并且该表数据变化不是很频繁的场景,例如一些静态页面,或者页面中的某块不经常发生变化的信息。
由于查询缓存需要缓存最新数据结果,因此表数据发生任何变化(insert、update、delete或其他可能产生数据变化的操作),都会导致查询缓存被刷新。因而,对于一个更新频率非常低而只读查询频率非常高的场景下,打开查询缓存还是比较有优势的。
mysql 1 运行机制+SQL语句执行过程
标签:innodb 并且 util 注解 通过 认证 sun公司 组件 级别