MySQL基本组成
SQL执行流程
- Server 层主要包括连接器、查询缓存、分析器、优化器、执行器,包含了MySQL主要的很多核心功能,以及所有的内置函数、存储过程、触发器、视图等,其实就是所有跨存储引擎的功能都是在这一层实现的
- 存储引擎层,主要负责数据的存储和读取,是以插件的形式存在的 ,支持如
InnoDB
、MyISAM
、Memory
等多个存储引擎,现在默认为InnoDB
查询缓存
-
当一个SQL执行时首先会进入查询缓存
-
查看之前是否执行过该语句,如果执行过则会以key-value的形式保存在缓存中,key是查询语句,value是查询结果
-
如果缓存命中则直接返回结果,如果查询语句不在缓存中继续后面的流程
-
大多数情况下我们不推荐使用查询缓存,因为缓存失效非常频繁,只要一个更新,那么这个表上所有的缓存都会失效,吐过数据的更新比较多,那么缓冲命中的效率很低,不断的在失效
-
在MySQL中提供了参数
query_cache_type
参数来设置,默认是DEMAND
,表示对默认的SQL都不使用查询缓存,如果要对特的语句进行缓存查询,则可以使用SQL_CACHE
来显示的指定,如select SQL_CACHE * from T where ID=1;
-
在MySQL8.0 开始,查询缓存整个功能模块已经删除掉不再拥有
分析器
- 分析器主要包含词法分析与语法分析
- 词法分析主要分析一条SQL中各个字符串代表什么,比如
select
标记出来,这就是一个查询,在具体的表名,查询 的字段等等全部分析出来 - 语法分析主要是分析SQL语句是否符合MySQL的规范,如果我们SQL写的有问题,那么经常看到的一个异常就是
You have an error in your SQL syntax
的提示
优化器
- 对我们的SQL进行优化,得到更高的执行计划
- 如有多个索引时确定要用那个索引
- 当有多变联查
join
时,查询表的顺序 - 对查询条件和语句的优化
执行器
- 首先校验是否有对这张表的访问权限,如果没有权限则会报错
- 如果有,则根据引擎接口打开表进行数据的查询筛选
Buffer Pool
- 默认大小
128MB
, 偏小 - 对于16核32G机器,可以分配2G内存,配置文件:
my.ini
配置:
[server]
innodb_buffer_pool_size = 2147483648
数据页
- MySQL中对数据进行抽象,按照数据页的形式来存放到文件,当查询时,首先定位到要查询数据所在的数据页,之后将整个数据页加载到
Buffer Pool
中, - 数据页默认的大小是
16KB
, 也就是一页数据包含16KB
的数据 - 在
BufferPool
中的数据页一般我们叫缓存页,默认情况下缓存页与磁盘上的数据页大小是对应的 - 对于每个缓存页都有一个描述信息
- 描述信息包括:数据页的所属表空间,数据页的标号,这个缓存页在
Buffer Pool
中的内存地址以及其他一些信息 - 在
Buffer Pool
中,所有的描述信息都在最前面,然后各个缓存页放在后面
- 描述数据大小相当于缓存页大小的
5%
左右,也就是大概800
字节,所以当我们设置buffer pool
的大小为128MB
,但是实际上Buffer Pool
的真实大小会超出一些,可能有有130MB
左右,这多出来的就是每个缓存页的描述信息
表空间
- 平时我们创建张表时都会在磁盘上对应着一个
表名.ibd
, 这样的磁盘数据文件,这就是表空间的概念和物理体现 - 对于一些系统表空间可能存在着对应多个磁盘文件,我们自己创建的表对应的表空间一般都是对应一个
表名.ibd
的数据文件
数据区
-
在表空间中有太多的数据页不好管理,这是引入了数据区的概念,英文:
extent
-
一个数据区中有连续的
64
个数据页,每个数据页16kb
, 所以每个数据区大小是1MB
-
同时
265
个数据区被划分为一组 -
在表空间中第一组数据区的第一个数据区的前三个数据页是固定的,存放一些特殊的描述性的信息
-
FSP_HDR
数据页: 存放一些表空间和这一组数据区的属性 -
IBUF——BITMAP
数据页:存放这组数据页所有的insert buffer
的一些信息 -
INODE
数据页:存放一些特殊信息
-
-
表空间中其他各组数据区的第一个数据区的头两个数据页都是存放特殊信息的
本文由AnonyStar 发布,可转载但需声明原文出处。
欢迎关注微信公账号 :云栖简码 获取更多优质文章
更多文章关注笔者博客 :云栖简码 i-code.online