Mysql-09 Mysql的内部组件结构

Mysql分为Server层和存储引擎层

注:MySQL 5.5.5 版本开始Innodb成为了默认存储引擎。如果在create table时不指定表的存储引擎类型,默认会给设置存储引擎为InnoDB。

连接器 

连接器负责跟客户端建立连接、和客户端通信、获取权限、维持和管理连接

客户端包括navicat,mysql front,jdbc,SQLyo等

连接命令:mysql -h host[数据库地址] -u root[用户] -p root[密码] -P 3306

客户端和连接器TCP 握手后,连接器就开始认证客户端的身份(用输入的用户名和密码)。

1、如果用户名或密码不对,就会收到一个"Access denied for user"的错误,然后客户端程序结束执行。

2、如果用户名密码认证通过,连接器会到权限表里面查出用户拥有的权限。之后,这个连接里面的权限判断逻辑,都将依赖于此时读到的权限。

3、一个用户成功建立连接后,即使用管理员账号对这个用户的权限做了修改,也不会影响已经存在连接的权限。修改完成后,只有再新建的连接才会使用新的权限设置。

查询缓存(mysql 8.0已经移除了查询缓存功能

MySQL 拿到一个查询请求后,会先到查询缓存拿数据,之前执行过的语句及其结果以 key-value 对的形式缓存在内存中。key 是查询的语句,value 是查询的结果。缓存中存在直接返回给客户端。

缓存中不存在,就会继续后面的执行阶段。执行完成后,执行结果会被存入查询缓存中。

只要有对一个表的更新,这个表上所有的查询缓存都会被清空,对于更新频繁的场景来说,查询缓存的命中率会非常低。

一般建议在静态表(极少更新的表)里使用查询缓存,比如系统配置表、字典表

my.cnf配置query_cache_type

  • 0代表关闭查询缓存OFF
  • 1代表开启ON
  • 2(DEMAND)代表当sql语句中有SQL_CACHE关键词时才缓存

分析器

如果没有命中查询缓存,就要开始真正执行语句了

sql示例:select * fro test where id=1;

1、 解析SQL 语句。

2、词法分析,sql是由多个字符串和空格组成的一条 SQL 语句,MySQL 需要识别出里面的字符串分别是什么。

3、MySQL 从"select"关键字识别出来是一个查询语句。字符串“test ”识别成表名,把字符串“id”识别成列名。

4、语法分析。根据词法分析的结果,语法分析器会根据语法规则,判断输入的 SQL 语句是否满足 MySQL 语法。

如果语句不对,就会收到“You have an error in your SQL syntax”的错误提醒,比如 from 写成了 "rom"。

优化器

经过了分析器,在开始执行之前,还要先经过优化器的处理。

1、优化器是在表里面有多个索引的时候,决定使用哪个索引

2、在一个语句有多表关联(join)的时候,决定各个表的连接顺序3

3、一些mysql自己内部的优化机制。

执行器

1、开始执行的时候,要先判断一下对表 test有没有查询的权限,没有权限返回错误

2、如果命中查询缓存,会在查询缓存返回结果的时候,做权限验证

3、如果有权限,就打开表继续执行。打开表的时候,执行器会根据表的引擎定义,去使用这个引擎提供的接口。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值