MySQL的内部组件结构

MySQL由Server层和存储引擎层组成。Server层包括连接器、查询缓存、分析器、优化器和执行器,处理核心服务功能和内置函数。存储引擎层如InnoDB负责数据存储和提取。连接器建立并管理客户端连接,查询缓存存储已执行的查询结果,分析器进行词法和语法分析,优化器选择最佳查询路径,执行器执行SQL语句并处理权限。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 MySQL可以分为Server层和存储引擎层两部分。

Server层

        主要包括连接器、查询缓存、分析器、优化器、执行器等,涵盖MySQL的大多数核心服务功能,以及所有的内置函数,所有跨存储引擎的功能都在这一层实现,比如存储过程、触发器、视图。

Store层

        存储引擎层负责数据的存储和提取。其架构模式是插件式的,支持Innodb、MyISAM、Memory等多个存储引擎。现在最常用的是InnoDB,在创建表时,不指定标的存储引擎类型,默认会设置为InnoDB。

连接器

        通过客户端连接MySQL数据库,客户端要向mysql发起通信都必须先跟Server端建立通信,而建立连接就是连接器完成的。

        第一步 连接数据库,连接器负责跟客户端建立连接、获取权限、维持和管理连接。

        mysql ‐h host[数据库地址] ‐u root[用户] ‐p root[密码] ‐P 3306

         完成经典的TCP握手以后,连接器就开始认证身份,输入用户名和密码。

查询缓存

        show database;

        use dbname;

        show tables;

        describe user; (获取mysql数据库中user表的列信息)

  MySQL拿到一个查询请求以后,会先查询缓存之前是否执行过这条语句,如果有直接返回缓存中的结果。之前执行过的语句会以key-value的形式,被直接缓存在内存中。key是查询的语句,value是查询的结果。

        但大多数查询缓存是个鸡肋:因为查询缓存失效非常频繁,只要有对一个表更新,这个表上所有的查询都会被清空。

        建议在静态表(极少做更新修改的表,系统配置表等等)可以修改my.cnf参数query_cache_type设置为DEMAND(2,OFF - 0; ON - 1; 2 - DEMAND)

        这样对于默认SQL语句都不使用查询缓存。而对你确定要使用查询缓存的语句可以像如下方式写:SELECT SQL_CACHE * FROM test;

        

分析器

        如果没有命中查询缓存,就要开始真正执行语句了。首先会做“词法分析”识别出里面的字符串分别是什么,代表什么。

        词法分析器原理

                1. 词法分析

                2. 语法分析

                3. 语义分析

                4. 构造执行树

                5. 生成执行计划

                6. 计划的执行

 

 SQL语句的分析分为词法分析与语法分析,语法分析由Bison生成。

优化器

        在开始真正执行前,还要先经过优化器的处理。

        优化器是在表里面有多个索引的时候,决定使用哪个索引;或者在一个语句有多表关联(join)的时候,决定各表的连接顺序。

        select * from test1 join test2 using(ID) where test1.name='a' and test2.name='b';

        在执行时既可以先从表test1里面取,再根据ID值关联到表test2,在判断test2里面name的值        也可以先从test2里面取,再根据ID关联到表test1,在判断test1里面name的值;

执行器

        开始执行的时候,先判断对这个表T有没有查询权限,没有会返回没有权限的错误。

        select * from test where id = 1;

        id字段没有索引,那么执行器的执行流程是这样的(按条件遍历):

                1. 调用InnoDB引擎接口去这个表的第一行,判断ID值是不是10,如果不是则跳过,如果是则将这行存在结果集中;

                2. 调用引擎接口取下一行,重复相同的判断逻辑,知道取到这个表的最后一行;

                3. 执行器将上述遍历过程中所有满足条件的行组成的记录集作为结果集返回给客户端。

        rows_examined字段:表示这个语句执行过程中扫描了多少行,这个值就是在执行器每次调用引擎获取数据行时累加的。

bin_log归档

        MySQL会将执行SQL语句的执行逻辑记录在bin-log中。

        binlog是Server层实现的二进制日志,记录我们的CUD操作,当不小心误删数据库,我们可以使用binlog进行归档,开启MySQL中的binlog功能。

log-bin=/usr/local/mysql/data/binlog/mysql-bin

binlog-format=ROW #binlog有3种格式: statement, row, mixed

sync-binlog=1 #表示每1次执行写入就与硬盘同步,会影响性能,为0时表示,事务提交是mysql不做刷盘操作

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值