论坛
潜水/灌水快乐,沉淀知识,认识更多同行。
ToB圈子
加入IT圈,遇到更多同好之人。
朋友圈
看朋友圈动态,了解ToB世界。
ToB门户
了解全球最新的ToB事件
博客
Blog
排行榜
Ranklist
文库
业界最专业的IT文库,上传资料也可以赚钱
下载
分享
Share
导读
Guide
相册
Album
记录
Doing
搜索
本版
文章
帖子
ToB圈子
用户
免费入驻
产品入驻
解决方案入驻
公司入驻
案例入驻
登录
·
注册
只需一步,快速开始
账号登录
立即注册
找回密码
用户名
Email
自动登录
找回密码
密码
登录
立即注册
首页
找靠谱产品
找解决方案
找靠谱公司
找案例
找对的人
专家智库
悬赏任务
圈子
SAAS
IT评测·应用市场-qidao123.com技术社区
»
论坛
›
软件与程序人生
›
云原生
›
MySQL底子架构
MySQL底子架构
王國慶
论坛元老
|
2024-7-25 17:06:05
|
显示全部楼层
|
阅读模式
楼主
主题
1865
|
帖子
1865
|
积分
5599
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. 使用场景:
通常用于更新不太频繁的小表,用以快速得到访问结果。
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
本帖子中包含更多资源
您需要
登录
才可以下载或查看,没有账号?
立即注册
x
回复
使用道具
举报
0 个回复
倒序浏览
返回列表
快速回复
高级模式
B
Color
Image
Link
Quote
Code
Smilies
您需要登录后才可以回帖
登录
or
立即注册
本版积分规则
发表回复
回帖并转播
回帖后跳转到最后一页
发新帖
回复
王國慶
论坛元老
这个人很懒什么都没写!
楼主热帖
webman
不想打开 IDE 的摆烂一天
Jupyter Notebook,太强大了
React技巧之发出http请求
【Shashlik.EventBus】.NET 事件总线, ...
【网络】https单向认证和双向认证 ...
APP内存管理
Apache DolphinScheduler 3.0.0 正式版 ...
Bluecmsv1.6-代码审计
java如何显示"html转义字符"对应的原始 ...
标签云
AI
运维
CIO
存储
服务器
浏览过的版块
运维.售后
网络安全
虚拟化与私有云
向量数据库
数据仓库与分析
DevOps与敏捷开发
IOS
主机安全
移动端开发
程序人生
快速回复
返回顶部
返回列表