李林超博客
首页
归档
留言
友链
动态
关于
归档
留言
友链
动态
关于
首页
Java
正文
【转载】初识MySQL基本架构
Leefs
2020-11-28 AM
1458℃
0条
# 【转载】初识MySQL基本架构 ### MySQL 的基本架构示意图 ![02.浅谈MySQL基本架构01.png](https://lilinchao.com/usr/uploads/2020/11/3637676033.png) ### MySQL层次结构 ##### MySQL可以分为**Server层**和**存储引擎层**两部分。 + **Server层:**包括连接器、查询缓存、分析器、优化器、执行器等,涵盖 MySQL 的大多数核心服务功能,以及所有的内置函数(如日期、时间、数学和加密函数等),所有跨存储引擎的功能都在这一层实现,比如存储过程、触发器、视图等。 + **存储引擎层**:负责数据的存储和提取。其架构模式是插件式的,支持`InnoDB`、 `MyISAM`、`Memory`等多个存储引擎。现在最常用的存储引擎是 InnoDB,它从 MySQL 5.5.5 版本开始成为了默认存储引擎。 ### 查询缓存 **执行步骤:** + **查询缓存:**MySQL 拿到一个查询请求后,会先到查询缓存看看,之前是不是执行过这条语句。之前 执行过的语句及其结果可能会以 key-value 对的形式,被直接缓存在内存中。key 是查询 的语句,value 是查询的结果。如果你的查询能够直接在这个缓存中找到 key,那么这个 value 就会被直接返回给客户端。 + **缓存中没有**:会继续后面的执行阶段。执行完成后,执行结果会被存入查询缓存中。你可以看到,如果查询命中缓存,MySQL 不需要执行后面的复杂操作,就可以直接返回结果,这个效率会很高。 + **是否使用缓存:**查询缓存的失效非常频繁,只要有对一个表的更新,这个表上所有的查询缓存都会被清空。因此很可能你费劲地把结果存起来,还没使用呢,就被一个更新全清空了。 对于更新压力大的数据库来说,查询缓存的命中率会非常低。除非你的业务就是有一张静态表,很长时间才会更新一次。比如,一个系统配置表,那这张表上的查询才适合使用查询缓存 + 按需使用:MySQL 也提供了这种“按需使用”的方式。你可以将参数 `query_cache_type` 设置 成 `DEMAND`,这样对于默认的 SQL 语句都不使用查询缓存。而对于你确定要使用查询缓 存的语句,可以用 SQL_CACHE 显式指定, 像下面这个语句一样: > mysql> select SQL_CACHE * from T where ID=10; MySQL 8.0 版本直接将查询缓存的整块功能删掉了,也就是说 8.0 开始彻 底没有这个功能了 ### 分析器 + **词法分析** 你输入的是由多个字符串和空格组成的一条 SQL 语句, MySQL 需要识别出里面的字符串分别是什么,代表什么。 MySQL 从你输入的"select"这个关键字识别出来,这是一个查询语句。它也要把字符 串“T”识别成“表名 T”,把字符串“ID”识别成“列 ID”。 + **语法分析** 根据词法分析的结果,语法分析器会根据语法规则,判断你输入的这个QL 语句是否满足MySQL 语法。 一般语法错误会提示第一个出现错误的位置,所以你要关注的是紧接“use near”的内 容。 ### 优化器 优化器是在表里面有多个索引的时候,决定使用哪个索引;或者在一个语句有多表关联 (join)的时候,决定各个表的连接顺序 ```MySQL select * from t1 join t2 using(ID) where t1.c=10 and t2.d=20; 既可以先从表 t1 里面取出 c=10 的记录的 ID 值,再根据 ID 值关联到表 t2,再判断 t2 里面 d 的值是否等于 20 也可以先从表 t2 里面取出 d=20 的记录的 ID 值,再根据 ID 值关联到 t1,再判断 t1 里面 c 的值是否等于 10 优化器的作用就是决定选择使用哪一个方案 ``` ### **执行器** + **执行前的判断** 要先判断一下你对这个表 T 有没有执行查询的权限,如果没有,就会返 回没有权限的错误(如果命中查询缓存,会在查询缓存返回结果的时候,做权限验证。查询也会在优化器之前调用 precheck 验证权限) + **以索引示例** + ID 字段没有索引 ``` 1. 调用 InnoDB 引擎接口取这个表的第一行,判断 ID 值是不是 10,如果不是则跳过,如 果是则将这行存在结果集中; 2. 调用引擎接口取“下一行”,重复相同的判断逻辑,直到取到这个表的最后一行。 3. 执行器将上述遍历过程中所有满足条件的行组成的记录集作为结果集返回给客户端。 ``` + ID 字段有索引 ``` 1.第一次调用的是“取满足条件的第一行”这个接口 2.之后循环取“满足条件的下一行”这个接口,接口都是引擎中已经定义好的 ``` *附:* [参考原文链接](https://www.cnblogs.com/eternityz/p/12392073.html)
标签:
MySQL
非特殊说明,本博所有文章均为博主原创。
如若转载,请注明出处:
https://www.lilinchao.com/archives/968.html
上一篇
[转载]图解 Docker 架构
下一篇
Nginx动静分离介绍
取消回复
评论啦~
提交评论
栏目分类
随笔
2
Java
326
大数据
229
工具
31
其它
25
GO
47
标签云
Elastisearch
CentOS
Flink
MyBatisX
Eclipse
Quartz
Netty
Typora
Jquery
Golang基础
Shiro
线程池
SpringCloudAlibaba
Spark SQL
持有对象
Scala
数据结构
FileBeat
Linux
人工智能
MySQL
高并发
并发线程
Spring
稀疏数组
链表
RSA加解密
Elasticsearch
并发编程
NIO
友情链接
申请
范明明
庄严博客
Mx
陶小桃Blog
虫洞