MySQL基础架构

文章目录

  • MySQL基础架构
  • 一、连接器 - 建立连接,权限认证
  • 二、查缓存 - 提高效率
  • 三、分析器 - 做什么
  • 四、优化器 - 怎么做
  • 五、执行器 - 执行语句
  • 六、存储引擎
    • 1、存储引擎的概述
    • 2、存储引擎的对比
    • 3、存储引擎的命令
    • 4、存储引擎的选择

MySQL基础架构

大体来说,MySQL可以分为 Server层存储引擎层 两部分。

  • Server层:涵盖MySQL的大多数核心服务功能,以及所有的内置函数(如日期、时间、数学和加密函数等)
    • 所有跨存储引擎的功能都在这一层实现,比如存储过程、触发器、视图等。
  • 存储引擎层:负责数据的存储和提取。其架构模式是插件式的,支持InnoDB、MyISAM、Memory等多个存储引擎。

在这里插入图片描述

不同的存储引擎共用一个Server层,也就是从连接器到执行器的部分。

一、连接器 - 建立连接,权限认证

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

# 连接命令
mysql -h 127.0.0.1 -P 3306 -u root -p
# 本机登录(省略 -h ip -P port)
mysql -u root -p

密码也可以直接跟在-p后面写在命令行中,但这样可能会导致你的密码泄露,所以不建议。

连接命令中的 mysql 是客户端工具,用来跟服务端建立连接。

连接服务包含 本地socket通信 和 基于客户端/服务端工具实现的类似TCP/IP的通信。

  • 主要完成一些类似于连接处理、授权认证及相关的安全方案

该层引入了线程池的概念,为通过安全认证接入的客户端提供线程。

同样在该层上可以实现基于SSL的安全链接。服务器也会为安全接入的每个客户端验证它所具有的操作权限。

在完成TCP握手后,连接器开始进行认证:

  • 用户名密码错误,会收到一个 “Access denied for user” 的错误,然后客户端程序结束执行。
  • 用户名密码正确,连接器会到权限表查出你拥有的权限(之后这个连接的权限判断,都依赖于此时读到的)

这就意味着,一个用户成功建立连接后,即使修改了权限,也不会影响已经存在的连接,只有重新连接才会生效。

连接完成后,如果你没有后续的动作,这个连接就处于空闲状态(Command列显示为Sleep

# 查看连接列表
show processlist;

在这里插入图片描述

客户端如果太长时间没动静,连接器就会自动将它断开。这个时间由参数wait_timeout控制,默认值是8小时

  • 长连接:连接成功后,如果客户端持续有请求,则一直使用同一个连接。
  • 短连接:每次执行完很少的几次查询就断开连接,下次查询再重新建立一个。

建立连接的过程通常是比较复杂的,因此在使用中要尽量减少建立连接的动作,也就是尽量使用长连接

全部使用长连接后,你可能会发现,有些时候MySQL占用内存涨得特别快

MySQL在执行过程中,临时使用的内存是管理在连接对象中的,这些资源在连接断开的时候才会释放。所以如果长连接累积下来,可能导致内存占用太大,被系统强行杀掉(OOM),从现象看就是MySQL异常重启了。

怎么解决这个问题呢?可以考虑以下两种方案。

  • 定期断开长连接。使用一段时间,或程序里面判断执行过一个占用内存的大查询后,断开连接,之后再重连。
  • 如果用的是MySQL 5.7或更新版本,可以在每次执行一个比较大的操作后,执行 mysql_reset_connection 来重新初始化连接资源。这个过程不需要重连和重新做权限验证,但是会将连接恢复到刚刚创建完时的状态。

二、查缓存 - 提高效率

执行过的语句及其结果可能会以key-value的形式,被直接缓存在内存中。key是查询语句,value是查询结果。

select * from T where ID=10;

MySQL拿到一个查询请求后,会先查询缓存,如果查询命中缓存就直接返回结果,否则继续执行后面的操作。

查询缓存的失效非常频繁,只要有对一个表的更新,这个表上所有的查询缓存都会被清空。因此:

  • 不推荐用缓存查询:更新频繁的表
  • 推荐使用缓存查询:静态表,很长时间才会更新一次

可以将参数 query_cache_type 设置成 DEMAND,默认不查询缓存。也可以通过查询的时候手动指定,如下:

# 查询缓存
select SQL_CACHE * from T where ID=10;
# 不查询缓存
select SQL_NO_CACHE * from T where ID=10;

注意:MySQL 8.0版本直接将查询缓存的整块功能删掉了,也就是说8.0开始彻底没有这个功能了。

三、分析器 - 做什么

如果没有命中缓存,就开始真正执行语句了。首先,MySQL需要知道你要做什么,因此需要对SQL语句做解析。

  • 先做 词法分析:解析 SQL语句 字符串的含义(查询/更新?表名/列名?表/列是否存在?)
  • 再做 语法分析:判断 SQL语句 是否符合 语法规则。

四、优化器 - 怎么做

经过了分析器,MySQL就知道你要做什么了。在开始执行之前,还要先经过优化器的处理。

  • 在表里面有多个索引的时候,决定 使用哪个索引
  • 在一个语句有多表关联(join)的时候,决定 各个表的连接顺序

优化器阶段完成后,SQL语句的执行方案就确定下来了。

五、执行器 - 执行语句

进入执行器阶段,开始操作引擎,执行语句:

  • 先判断对表T有没有执行查询的权限。如果没有,就返回没有权限的错误。
  • 如果有权限,就打开表继续执行。执行器就会根据表T的引擎定义,去调用对应引擎提供的接口

对于下面的语句,分析执行器的执行流程:

select * from T where ID=10;
  • 调用InnoDB引擎接口,“取第一行”,判断ID值是不是10,如果是,则将这行存在结果集中,不是则跳过
  • 调用InnoDB引擎接口,“取下一行”,重复相同的判断逻辑,直到取到这个表的最后一行。
  • 执行器将 上述遍历过程中 所有满足条件的行 组成的记录集 作为结果集返回给客户端。

对于有索引的表,执行的逻辑也差不多:

  • 第一次调用 “取满足条件的第一行” 这个接口。
  • 之后循环调用 “取满足条件的下一行” 这个接口。

在数据库的慢查询日志中有一个rows_examined的字段

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

注意:rows_examined ≠ 引擎扫描行数(某些场景下,执行器调用一次,在引擎内部会扫描多行)

六、存储引擎

存储引擎层真正的负责了MySQL中数据的存储和提取,服务器通过API和存储引擎进行通信。不同的存储引擎具有不同的功能,这样我们可以根据自己的需要,来选取合适的存储引擎。

1、存储引擎的概述

​ MySQL中的数据用各种不同的技术存储在文件或内存中,包括存储方式、索引技巧、锁定水平等不同功能。这些不同的技术以及配套的功能被称作存储引擎。

​ Oracle,SqlServer等数据库只有一种存储引擎。MySQL提供了插件式的存储引擎架构(多种存储引擎)。 所以MySQL可以根据需要使用相应引擎,或者编写存储引擎。

​ MySQL 常用的存储引擎有三种: InnoDB 、MyISAM 、MEMORY。创建表时如果不指定存储引擎,系统就会使用默认的存储引擎, MySQL5.5之前 默认是MyISAM,MySQL5.5之后就改为了InnoDB

2、存储引擎的对比

特点InnoDBMyISAMMEMORY
存储限制64TB
事务安全支持
锁机制行锁,表锁表锁表锁
外键支持
BTree索引支持支持支持
Hash索引支持
全文索引支持(5.6版本后)支持
集群索引支持
数据索引支持支持
索引缓存支持支持支持
数据可压缩支持
空间使用N/A
内存使用中等
批量插入速度

3、存储引擎的命令

-- 查看数据库支持的存储引擎
show engines;-- 查询某个数据表的存储引擎
show table status from 数据库名 where name = '数据表名';-- 创建表时指定存储引擎
create table 表名(列名 数据类型 约束,...
) engine = 存储引擎名;-- 修改数据表的存储引擎
alter table 表名 engine = 存储引擎名;-- 设置默认存储引擎
set default_storage_engine = <存储引擎名>

4、存储引擎的选择

# InnoDB(MySQL5.5之后默认的存储引擎)
1. 优点:1)InnoDB 提供了具有提交、回滚、崩溃恢复能力的事务安全。2)InnoDB 采用行锁,适合处理并发写操作。
2. 缺点:会占用更多的磁盘空间以保留数据和索引
3. 场景:1)对事务的完整性和安全性有比较高的要求。2)在并发条件下要求数据的一致性,写多读少。# MyISAM(MySQL5.5之前默认的存储引擎)
1. 优点:1)MyISAM 内存要求低,节约资源。2)MyISAM 采用表锁,读取速度快,查询效率高
2. 缺点:1)不支持事务和外键操作2)不适合并发写操作
3. 场景:1)对事务的完整性、并发性要求不是很高。2)以查询操作为主,只有很少的更新和删除操作,读多写少# MEMORY
1. 特点: 将所有数据保存在内存中,在需要快速定位记录和其他类似数据环境下,可以提供更快的访问。
2. 使用场景:通常用于更新不太频繁的小表,用以快速得到访问结果。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/749498.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

旅游管理系统 |基于springboot框架+ Mysql+Java+Tomcat的旅游管理系统设计与实现(可运行源码+数据库+设计文档)

推荐阅读100套最新项目 最新ssmjava项目文档视频演示可运行源码分享 最新jspjava项目文档视频演示可运行源码分享 最新Spring Boot项目文档视频演示可运行源码分享 目录 前台功能效果图 管理员功能登录前台功能效果图 系统功能设计 数据库E-R图设计 lunwen参考 摘要 研究…

Transformer面试题总结101道

在本文中&#xff0c;我们将回答一系列关于Transformer的问题&#xff0c;涵盖了从基础概念到高级应用的多个方面。无论您是准备面试、学习深度学习&#xff0c;还是对自然语言处理技术感兴趣&#xff0c;都希望本文能为您提供有益的启示和知识。 注&#xff0c;本文的面试题借…

数字电子技术实验(三)

单选题 1. MSI的全拼和含义是什么&#xff1f; A. m e t a l s i l i c o n。 B. m e d i u m s c a l e i n t e g r a t i o n。 C. m a i n t e n a n c e s u p p l y i t e m (i z a t i o n ) D. m a n a g e m e n t s y s t e m i n d i c a t o r 答案&#xff1…

九大运算符详解

目录 前言 一.算数运算符 1.1 算数运算符 1.2 算数运算案例 二.关系运算符 2.1关系运算符 2.2 关系运算案例 三.逻辑运算符 3.1 逻辑运算符 3.2 逻辑运算案例 四.位运算符 4.1 位运算符 4.2 位运算符案例 五.赋值运算符 5.1 赋值运算符 5.2 赋值运算符案例 六. 杂项运算符 6.1 …

idea中database的一些用法

1、查看表结构 方法1&#xff0c;右键&#xff0c;选这个 方法2 双击表后&#xff0c;看到数据&#xff0c;点DDL 方法3 写SQL时&#xff0c;把鼠标放在表名上&#xff0c;可以快速查看表结构 2、表生成对应的实体类 表中右键&#xff0c;选择这2个&#xff0c;选择生成的路…

FPGA和ASIC

前言 大家好&#xff0c;我是jiantaoyab&#xff0c;这是我所总结作为学习的笔记第16篇,在本篇文章给大家介绍FPGA和ASIC。 一个四核i7的CPU的晶体管中有20亿的晶体管&#xff0c;需要链接起20亿的晶体管可不是一件容易的事情&#xff0c;所以设计一个CPU需要用年来算&#x…

Day11:栈与队列part02:20. 有效的括号、1047.删除字符串中所有相邻重复项、150. 逆波兰表达式求值

https://blog.csdn.net/weixin_43303286/article/details/131869968?spm1001.2014.3001.5501 有效的括号 遇见左括号对应的右括号进栈&#xff0c;遇到右括号看栈顶&#xff0c;不相同就返回false class Solution {public boolean isValid(String s) {Stack<Character&g…

【代码随想录】【回溯算法】补day24:组合问题以及组合的优化

回溯算法&#xff1a;递归函数里面嵌套着for循环 给定两个整数 n 和 k&#xff0c;返回 1 … n 中所有可能的 k 个数的组合。 示例: 输入: n 4, k 2 输出: [ [2,4], [3,4], [2,3], [1,2], [1,3], [1,4], ] 包含组合问题和组合问题的剪枝优化 class solution:def combine(se…

C# 第三方曲线库及其特点

在 C# 中&#xff0c;有几个第三方库可以用于绘制曲线图&#xff0c;每个库都有自己的特点和优势。以下是一些常见的 C# 第三方曲线库及其特点&#xff0c;希望对大家有所帮助。北京木奇移动技术有限公司&#xff0c;专业的软件外包开发公司&#xff0c;欢迎交流合作。 1.LiveC…

C++从零开始(day51)——unordered_set,unordered_map学习使用

1.unordered系列关联式容器 C98中&#xff0c;STL提供了底层为红黑树结构的一系列容器&#xff0c;在查找时效率可以达到时间复杂度可以达到O(logN)&#xff0c;即红黑树的高度次&#xff0c;当树中的结点非常多时&#xff0c;查询效率也不理想&#xff0c;因此在C11中&#x…

力扣L10--- 3. 无重复字符的最长子串--2024年3月14日

1.题目 2.知识点 注1&#xff1a;containsKey 是 Java 中 HashMap 类的一个方法&#xff0c;用于检查哈希表中是否包含指定的键。 注2&#xff1a;在哈希表&#xff08;HashMap)中&#xff0c;每个键对应着唯一的值&#xff0c;因此键不能重复&#xff0c;但值可以重复。 (1)创…

ECMAScript标准-默认导出和导入

导出&#xff1a; export default{} const baseURL "http://www.baidu.com" export default{url:baseURL } 导入&#xff1a; import 变量名(自己定义的变量名&#xff0c;全部加载&#xff09; from ‘模块名或路径’ import obj from ./commonjs.js console.…

Java后端面试经验分享,~纯分享

本文将从面试、工作、学习三个方面分享最近面试的一些心得以及以后发展的一些规划&#xff0c;仅供参考&#xff0c;哈哈&#xff0c;毕竟本人也很菜&#xff0c;因为菜才要多学习。一会儿也会分享两本Java面试题库&#xff08;题库是b站大学找的&#xff0c;一会儿我也会分享出…

SpringBoot整合Seata注册到Nacos服务

项目引入pom文件 <!-- SpringCloud Seata 组件--> <dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-alibaba-seata</artifactId><version>${alibaba.seata}</version><exclusions><exc…

八股文打卡day34——数据库(11)

面试题&#xff1a;谈一下你对MySQL中锁的了解&#xff1f; 我的回答&#xff1a; 首先&#xff0c;从锁的粒度来分&#xff0c;可以分为&#xff1a; ①全局锁。全局锁主要用于数据库的备份&#xff0c;加上全局锁&#xff0c;意味着整个数据库都处于只读的状态。 ②行级锁。…

初学者必看的python中类型转换

Python中常见的类型转换 int(x [,base ]) 将x转换为一个整数 long(x [,base ]) 将x转换为一个长整数 float(x ) 将x转换到一个浮点数 complex(real [,imag ]) 创建一个复数 str(x ) 将对象 x 转换为字符串 repr(x ) 将对象 x 转换为表达式字符串 eval(str ) 用来计算在字符串中…

`sig_atomic_t` 是C语言中的一个数据类型,它通常用于在信号处理程序中声明变量

例子 static volatile sig_atomic_t signal_num; static void SigTerm(int signo) {running 0;signal_num signo; }int main(int argc, char *argv[]) {signal(SIGTERM, SigTerm);signal(SIGINT, SigTerm); }sig_atomic_t 是C语言中的一个数据类型&#xff0c;它通常用于在信…

(57)最富有客户的资产总量

文章目录 1. 每日一言2. 题目3. 解题思路3.1 法一3.2 法二 4. 代码4.1 法一4.2 法二 5. 结语 1. 每日一言 Care and diligence bring luck. 谨慎和勤奋&#xff0c;带来好运气。 2. 题目 题目链接&#xff1a;最富有客户的资产总量 给你一个 m x n 的整数网格 accounts &…

作业字符数组

凯撒密码 凯撒密码&#xff08;Caesar&#xff09;加密时会将明文中的 每个字母 都按照其在字母表中的顺序向后&#xff08;或向前&#xff09;移动固 定数目&#xff08; 循环移动 &#xff09;作为密文。例如&#xff0c;当偏移量是左移 3 的时候&#xff08;解密时的密钥…

python二级备考(3)-综合应用

1 《命运》是著名科幻作家倪匡的作品。这里给出《命运》的一个网络版本文件&#xff0c;文件名为“命运. txt”。 问题1 (5分) :在PY301-1. py文件中修改代码&#xff0c;对“命运. txt”文件进行字符频次统计&#xff0c;输出频次最高的中文字符(不包含标点符号)及其频次&…