Loading [MathJax]/jax/output/CommonHTML/config.js
部署DeepSeek模型,进群交流最in玩法!
立即加群
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Mysql框架——Mysql系列(一)

Mysql框架——Mysql系列(一)

原创
作者头像
翰墨飘香
修改于 2025-02-08 00:13:18
修改于 2025-02-08 00:13:18
60204
代码可运行
举报
文章被收录于专栏:Mysql实战Mysql实战翰墨飘香
运行总次数:4
代码可运行

一、mysql框架

mysql主要分为Server层存储引擎层两部分

1.客户端

各种语言都提供了连接mysql数据库的方法,比如jdbc、php、go等,可根据选择 的后端开发语言选择相应的方法或框架连接mysql

2.server层

包括连接器、查询缓存、分析器、优化器、执行器等,涵盖mysql的大多数核心服务功能,以及所有的内置函数(例如日期、世家、数 学和加密函数等),所有跨存储引擎的功能都在这一层实现,比如存储过程、触发器、视图等。

3.存储引擎层

负责数据的存储和提取,是真正与底层物理文件打交道的组件。 数据本质是存储在磁盘上的,通过特定的存储引擎对数据进行有组织的存放并根据业务需要对数据进行提取。存储引擎的架构模式是插件式的,支持Innodb,MyIASM、Memory等多个存储引擎。现在最常用的存储引擎是Innodb,它从mysql5.5.5版本开始成为了默认存储引擎。

4.物理文件层

存储数据库真正的表数据、日志等。物理文件包括:redolog、undolog、binlog、errorlog、querylog、slowlog、data、index等

二、Server层重要主件介绍

1、连接器

  • 连接器负责来自客户端的连接、获取用户权限、维持和管理连接。
  • 一个用户成功建立连接后,即使你用管理员账号对这个用户的权限做了修改,也不会影响已经存在连接的权限。修改完成后,只有再新建连接才会使用新的权限设置
  • 客户端如果太长时间没动静,连接器就会自动将它断开。这个时间是由参数 wait_timeout 控制的,默认值是8小时。如果在连接被断开之后,客户端再次发送请求的话,就会收到一个错误提醒: Lost connection to MySQL server during query。

2、查询缓存

MySQL 8.0 版本直接将查询缓存的整块功能删掉了。

(查看版本 show variables like '%version%' )(2023MT-5.7)

mysql拿到一个查询请求后,会先到查询缓存查看之前是否执行过这条语句。前执行过的语句及其结果可能会以key-value对的形式,被直接缓存在内存中。key是查询的语句,value是查询的结果。如果当前sql查询能够直接在查询缓存中找到key,那么这个value就会被直接返回给客户端。

其实大多数情况下建议不要使用查询缓存,为什么呢?因为查询缓存往往弊大于利。查询缓存非常容易失效,只要对一个表进行更新,与这个表相关的所有查询缓存都会被清空。因此很可能费劲把结果存起来后,还没使用就被一个更新操作全清空了。对于更新操作多的数据库来说,查询缓存的命中率会非常低。除非业务需要的是一张静态表,很长时间才会更新一次。比如,一个系统配置表,那么这张表的查询才适合使用查询缓存。

好在mysql提供了这种“按需使用”的方式,可以将参数query_cache_type设置成DEMAND,这样对于默认的sql语句都不使用查询缓存,而对于确定要使用查询缓存的语句,可以用SQL_CACHE显示指定,像下面这个语句一样:

3、分析器

词法分析(识别关键字,操作,表名,列名)

语法分析 (判断是否符合语法)

4、优化器

优化器是在表里面有多个索引的时候,决定使用哪个索引;或者在一个语句有多表关联(join)的时候,决定各个表的连接顺序。优化器阶段完成后,这个语句的执行方案就确定下来了,然后进入执行器阶段。

5、执行器

开始执行的时候,要先判断一下用户对这个表 T 有没有执行查询的权限。如果没有,就会返回没有权限的错误。如果命中查询缓存,会在查询缓存返回结果的时候,做权限验证。查询也会在优化器之前调用 precheck 验证权限。如果有权限,就打开表继续执行。打开表的时候,执行器就会根据表的引擎定义,去调用这个引擎提供的接口。在数据库的慢查询日志中看到一个rows_examined 的字段,表示这个语句执行过程中扫描了多少行,这个值就是在执行器每次调用引擎获取数据航的时候累加的。在有些场景下,执行器调用一次,在引擎内部则扫描了多行,因此引擎扫描行数跟rows_examined并不是完全相同的。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
使用 Junit + Mockito 实践单元测试
相信做过开发的同学,都多多少少写过下面的代码,很长一段时间我一直以为这就是单元测试...
JMCui
2020/05/06
4.8K0
Mocktio 使用(上)
注意,mock 对象的方法的返回值默认都是返回类型的默认值。例如,返回类型是 int,默认返回值是 0;返回类型是一个类,默认返回值是 null。
HLee
2021/09/27
1.8K0
Mocktio 使用(上)
mock测试及jacoco覆盖率
单元测试是保证项目代码质量的有力武器,但是有些业务场景,依赖的第三方没有测试环境,这时候该怎么做Unit Test呢,总不能直接生产环境硬来吧?
菩提树下的杨过
2020/09/11
4.5K1
Spring Boot单元测试流程
在Spring Boot项目中,单元测试是一个至关重要的环节。它不仅可以确保代码的正确性,还可以提高代码质量,减少bug。本文将详细介绍Spring Boot单元测试的基本流程,包括如何搭建一个简单的Spring Boot项目、单元测试的基本知识点以及如何mock数据。
程序员波特
2024/03/16
3030
Spring Boot单元测试流程
告别加班/解放双手提高单测覆盖率之Java 自动生成单测代码神器推荐
很多公司对分支单测覆盖率会有一定的要求,比如 单测覆盖率要达到 60% 或者 80%才可以发布。
明明如月学长
2022/02/15
6.7K0
告别加班/解放双手提高单测覆盖率之Java 自动生成单测代码神器推荐
mockit测试
//静态导入mockit包 import static org.mockito.Mockito.*; //创建mock,mock一个接口 List mockedList = mock(List.class); //使用mock对象 mockedList.add("one"); mockedList.clear(); //验证行为 verify(mockedList).add("one"); verify(mockedList).clear(); //mock具体的类 L
用户5344449
2019/05/07
1.5K0
Mockito入门:如何在Spring中Mock部分对象
随着分布式应用的开发逐渐成为标配,多个微服务团队合作来完成垂直业务的开发成为了一种常态。微服务使得团队可以专注于自己的业务逻辑,在和下游依赖和上游对接的团队聚焦好接口之后,就进入正式的开发。但是,每个团队的开发节奏往往不同,下游依赖所提供的服务有些时候不能在自测的时候提供稳定的服务。不仅是多个团队,单个团队中每个人所负责的模块之间也会存在依赖关系,也就同样存在这样的问题。
眯眯眼的猫头鹰
2019/09/30
11.2K0
Java一分钟之-Mockito:模拟对象测试
在Java单元测试领域,Mockito是一个广受好评的模拟框架,它使得开发者能够轻松创建和配置模拟对象,以便于在隔离环境中测试代码,尤其是那些依赖复杂或难以控制的对象。本文将深入浅出地介绍Mockito的核心概念、常见问题、易错点以及如何避免这些问题,同时通过实际代码示例加深理解。
Jimaks
2024/06/05
4020
Java一分钟之-Mockito:模拟对象测试
使用强大的 Mockito 来测试你的代码
这篇教程介绍了如何使用 Mockito 框架来给软件写测试用例。 1、预备知识 如果需要往下学习,你需要先理解 Junit 框架中的单元测试。 如果你不熟悉 JUnit,请查看下面的教程: http://www.vogella.com/tutorials/JUnit/article.html 2、使用mock对象来进行测试 2.1 单元测试的目标和挑战 单元测试的思路是在不涉及依赖关系的情况下测试代码(隔离性),所以测试代码与其他类或者系统的关系应该尽量被消除。一个可行的消除方法是替换掉依赖类(测试替换),
用户1332428
2018/03/09
11.3K0
使用强大的 Mockito 来测试你的代码
Mockito模拟进行单元测试
    MOCK意思是模拟的意思,主要被用来进行数据的人工组织,不会真正地调用第三方服务器,类似redis,mysql等都不会调用,也不用关心数据底层是如何进行处理的,我们要做的只是将本单元的逻辑进行单元测试,验证数据的逻辑处理性,而其中mock较好的框架就是Mockito。
chinotan
2019/07/15
9.6K0
Mockito模拟进行单元测试
Mocktio 使用(下)
thenReturn 用来指定特定函数和参数调用的返回值。thenReturn 中可以指定多个返回值,在调用时返回值依次出现。若调用次数超过返回值的数量,再次调用时返回最后一个返回值。
HLee
2021/10/11
3.6K0
Mocktio 使用(下)
#Android单元测试学习总结「建议收藏」
在Android Studio中新建一个项目的时候,app的gradle中会默认添加单元测试的相关依赖库:
全栈程序员站长
2022/09/06
5.2K0
#Android单元测试学习总结「建议收藏」
单元测试(Spring)
YGingko
2017/12/28
4.8K0
spring service层单元测试
service层测试较简单,目前大多数测试主要是针对public方法进行的。依据测试方法划分,可以分为两种:基于mock的隔离测试和基于dbunit的普通测试。 mock隔离测试 配置pom.xml
YGingko
2017/12/28
3K0
spring service层单元测试
SpringBoot2.x 单元测试
我曾经在 单元测试指南 一文中写到过单元测试的必要性和 Java 单元测试相关的工具及方法。单元测试能帮助我们在早期就规避、发现和修复很多不易察觉的 bug 和漏洞,而且更能保障后期的需求变动和代码重构时所带来的隐患,减少测试成本和维护成本。在 SpringBoot2.x 集成和写单元测试更加容易了。
Abalone
2022/07/14
1.8K0
junit4整合PowerMockito进行单元测试
所以我们在单测中,往往会使用mock的方式对这些代码做一个数据的模拟,从而达到对代码进行测试的一个目的。
半月无霜
2023/10/18
1.3K0
junit4整合PowerMockito进行单元测试
Java单元测试Mock工具Mockito介绍
Mock就是在测试过程中对于那些不容易构建的依赖进行模拟,以保证系统的测试流程可以正常运行,即生成一个和实际使用场景不一样的对象;
心平气和
2021/10/14
3.4K0
用过举手!SpringBoot 单元测试利器-Mockito
Mockito 是一种 Java mock 框架,他主要是用来做 mock 测试的,他可以模拟任何 Spring 管理的 bean、模拟方法的返回值、模拟抛出异常...等,在了解 Mockito 的具体用法之前,得先了解什麽是 mock 测试
JAVA葵花宝典
2020/03/11
4.2K0
测试mockito
@RunWith(MockitoJUnitRunner.class) public class BaseMock {
XING辋
2019/03/26
7950
SpringBoot - 单元测试利器Mockito入门
Mock 测试就是在测试过程中,创建一个假的对象,避免你为了测试一个方法,却要自行构建整个 Bean 的依赖链。
小小工匠
2021/08/17
17.4K1
SpringBoot - 单元测试利器Mockito入门
相关推荐
使用 Junit + Mockito 实践单元测试
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验