MySQL基础架构

news2024/11/19 10:45:49

文章目录

  • 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.coloradmin.cn/o/1521286.html

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

相关文章

力扣-20. 有效的括号(回顾知识哈希表,栈)

给定一个只包括 ‘(’&#xff0c;‘)’&#xff0c;‘{’&#xff0c;‘}’&#xff0c;‘[’&#xff0c;‘]’ 的字符串 s &#xff0c;判断字符串是否有效。 有效字符串需满足&#xff1a; 左括号必须用相同类型的右括号闭合。 左括号必须以正确的顺序闭合。 每个右括号都有…

HTML万字学习总结

html文本标签特殊符号图片音频与视频超链接表单列表表格语义标签(布局) html文本标签 标签简介<html></html>根目录<head></head>规定文档相关的配置信息&#xff08;元数据<body></body>元素表示文档的内容<meta></meta>表示…

“技多不压身”是什么意思?看完这篇文章你会明白:有了手艺,走遍天下都不怕!

“技多不压身”是什么意思&#xff1f;看完这篇文章你会明白&#xff1a;有了手艺&#xff0c;走遍天下都不怕&#xff01; 咱们的老祖宗流传一句话&#xff1a;“一招鲜&#xff0c;吃遍天。”这话说得直白&#xff0c;却道出了学一门手艺或技术对于人生的重要性。“李秘书讲…

Linux 学习笔记(16)

十六、 计划任务 在很多时候为了自动化管理系统&#xff0c;我们都会用到计划任务&#xff0c;比如关机&#xff0c;管理&#xff0c;备份之类的操作&#xff0c;我 们都可以使用计划任务来完成&#xff0c;这样可以是管理员的工作量大大降低&#xff0c;而且可靠度更好。 l…

电商经济和实体经济,哪个更有发展力?这篇文章讲的很详细!

我是电商珠珠 三年的冲击&#xff0c;使实体经济走向衰败&#xff0c;以至于到今天很多实体店仍无法正常营业&#xff0c;面临赔本的惨状。花大好几十万去做这件事&#xff0c;结果分币未挣。近年来&#xff0c;电商虽然发展的很快&#xff0c;但是平台众多&#xff0c;规则也…

“入站营销“VS“即时流量变现“客户该进谁家门?

在不断变化的市场环境下&#xff0c;两种主导战略“入站营销 ”和 “即时流量变现”决定了企业接触受众的方式。了解这些方法之间的根本区别对于企业制定有效的营销战略至关重要。 受众体的差别线索质量 “即时流量变现”&#xff0c;顾名思义&#xff0c;短时间&#xff0c;…

Leetcode - 周赛388

目录 一&#xff0c;3074. 重新分装苹果 二&#xff0c;3075. 幸福值最大化的选择方案 三&#xff0c;3076. 数组中的最短非公共子字符串 四&#xff0c;3077. K 个不相交子数组的最大能量值 一&#xff0c;3074. 重新分装苹果 本题是一道阅读理解题&#xff0c;就是将数组a…

springboot“力炫”健身馆网站

摘要 随着网络科技的不断发展以及人们经济水平的逐步提高&#xff0c;网络技术如今已成为人们生活中不可缺少的一部分&#xff0c;而信息管理系统是通过计算机技术&#xff0c;针对用户需求开发与设计&#xff0c;该技术尤其在各行业领域发挥了巨大的作用&#xff0c;有效地促…

7.1strcmp

strcmp 函数原型 extern int strcmp(const char *s1,const char *s2);规则 当s1<s2时&#xff0c;返回为负数&#xff1b; 当s1s2时&#xff0c;返回值0&#xff1b; 当s1>s2时&#xff0c;返回正数。 即&#xff1a;两个字符串自左向右逐个字符相比&#xff08;按ASCI…

springboot项目自定义切面增强方法功能(springboot记录日志)

说明 背景&#xff1a;记录系统接口日志入库&#xff0c;包含接口方法、入参、回参、响应时间、操作人、操作时间等信息。 方案&#xff1a;添加自定义切面处理 一、自定义切面注解 package com.gstanzer.supervise.annotation;import com.gstanzer.supervise.enums.Busine…

【BFS】走迷宫问题——acwing844

问题描述 给定一个 nm 的二维整数数组&#xff0c;用来表示一个迷宫&#xff0c;数组中只包含 0 或 1&#xff0c;其中 0表示可以走的路&#xff0c;1 表示不可通过的墙壁。 最初&#xff0c;有一个人位于左上角 (1,1) 处&#xff0c;已知该人每次可以向上、下、左、右任意一…

Ubuntu20下C/C++编程开启TCP KeepAlive

1、在linux下&#xff0c;测试tcp保活&#xff0c;可以使用tcp自带keepalive功能。 2、几个重要参数&#xff1a; tcp_keepalive_time&#xff1a;对端在指定时间内没有数据传输&#xff0c;则向对端发送一个keepalive packet&#xff0c;单位&#xff1a;秒 tcp_keep…

学习开发小程序的起航日记

2024年3月16日 不知不觉中三月份还只剩了一半的光景&#xff0c;我想写的内容还很多没有写&#xff0c;或者更应该说&#xff0c;是想积累的还有很多。现在最应该去完善Java的内容&#xff0c;可还是想先等等。想等搞清楚小程序部分&#xff0c;想等积累完小程序的内容。 这几…

unraid docker.img扩容

unraid 弹Docker image disk utilization of 99%&#xff0c;容器下载/更新失败 我的版本是6.11.5&#xff0c;docker.img满了导致容器不能更新&#xff0c;遇到同样问题的可以先用docker命令清除一下仓库(当然不一定能清理出来&#xff0c;我已经清理过只清理出来1G多点&…

黑马微服务p30踩坑

报错详情 : orderservice开不起来 : 发生报错 : 然后检查了以下端口啥的 &#xff0c;配置啥的都是没有问题的 ; 解决办法 : 1 . 修改nacos1,2,3中的端口&#xff0c;将conf 中 cluster.conf中 的 127.0.0.1 全部改成自己本机的真实ipv4地址; 本机真实ipv4地址查看 :…

Java学习笔记(14)

常用API Java已经写好的各种功能的java类 Math Final修饰&#xff0c;不能被继承 因为是静态static的&#xff0c;所以使用方法不用创建对象&#xff0c;使用里面的方法直接 math.方法名 就行 常用方法 Abs,ceil,floor,round,max,minm,pow,sqrt,cbrt,random Abs要注意参数的…

数据结构:树和二叉树

树的概念 1.树是一种非线性的数据结构。它是由n个有限节点的集合。 2.树分为根节点和子树。根节点没有前驱节点。 3.树的子树是由一个个子树组成&#xff0c;它们可以看作一个个集合。每个集合下面又有集合。 因此&#xff0c;树是递归定义的。 树形结构中&#xff0c;子树…

Leetcode刷题-(21~25)-Java

算法是码农的基本功&#xff0c;也是各个大厂必考察的重点&#xff0c;让我们一起坚持写算法题吧。 遇事不决&#xff0c;可问春风&#xff0c;春风不语&#xff0c;即是本心。 我们在我们能力范围内&#xff0c;做好我们该做的事&#xff0c;然后相信一切都事最好的安排就可…

软件应用,物流运单填写模板,物流打印快递单教程,货运单怎么打印视频教程

软件应用&#xff0c;物流运单填写模板&#xff0c;物流打印快递单教程&#xff0c;货运单怎么打印视频教程 一、前言 以下软件操作教程以 佳易王物流货运管理系统软件V17.2为例说明 件文件下载可以点击最下方官网卡片——软件下载——试用版软件下载 1、物流管理系统打印&a…

【webrtc】m122:PacingController 源码阅读

PacingController 关系与BitrateProber 关系更为密切PacingController 内置BitrateProber G:\CDN\signalapp_webrtc\modules\pacing\pacing_controller.hPacingControllerBitrateProber prober_;可配置BitrateProber 是否激活 PacingController 关系与BitrateProber 关系更为密…