前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >mysql体系结构

mysql体系结构

原创
作者头像
萧晚歌
修改2021-11-18 15:58:30
1K0
修改2021-11-18 15:58:30
举报
文章被收录于专栏:linux技术分享linux技术分享

mysql8.0体系结构

图来自网络
图来自网络

图上看mysql服务是一个c/s架构 它是用c和c++开发的

Connectors 端

可以通过,各种各样的客户端,链接mysql服务器 如mysql命令,各种apl等

server端

又分为很多模块

链接层

1提供链接协议 TCP/IP 本地的socket

2用户名密码验证(通过授权表做的验证数据库一启动,会把授权表加载到内存中 mysql.user mysql.db mysql.table_priv mysql.column_priv)

3提供链接线程

查看链接线程 show processlist;

查看后台所有线程 select * from performance_schema.threads\G

sql层

sql线程接收链接线程

预处理(lex) 语法,语义(语句是什么类型的),权限(访问的库或者表有没有权限) 检查

解析(yacc) 生成解析树 (ast抽象语法树)

优化 逻辑优化 基于关系代数的等价转换,在物理优化 参考统计信息(描述了,数据的分布,索引的一些状态,粗略记录表里有多少行)以及一些优化器算法,代价评估,生成执行计划(explain)

代码语言:javascript
复制
统计信息说明
统计信息记录的是 表的状态, 如表名 数据行 数据分布情况 索引状态信息...
统计信息是mysql定期收集而来 通过一些参数指标 不是实时收集的
mysql.innodb_index_stats
mysql.innodb_table_stats
#问题 一条sql语句昨天运行的好好的(0.01秒) ,突然变慢了(2min)? 为什么
由于统计信息不准确造成的,不走索引造成的
可以通过命令强制重新收集 也有参数控制
analyze teble 库名.表名;
或者 optimize table 库名.表名; #命令锁表 谨慎使用

引擎层

io线程接收sql线程

mysql和磁盘打交道的类似于linux的文件系统

图来自mysql官网
图来自mysql官网

innodb存储引擎分为内存结构和磁盘结构

存储的宏观结构

在mysql中一个数据库,就在系统中就是一个目录

在mysql中一个表 对应操作系统中的一个.ibd文件(8.0)

在操作系统可以通过ibd2sdi 文件名 可以查看文件

代码语言:javascript
复制
表中记录的 数据行 + 元数据(表属性,表的列(列属性),表名)
mysql8.0表的存储方式 每张表的数据都存储在ibd文件中
mysql5.7表的存储方式
数据行 ibd文件
源数据 frm +ibdata1(总体) 文件
Online DDL 的时候会更加快速

8.0新特性了解

代码语言:javascript
复制
metdata 结构变化
5.7版本问题
两套数据字典信息server层 .frm innodb数据字典
DDL无法原子化 (删除两张表的时候,不是一起执行的)
frm和innodb层会出现不一致
并发处理需要小心处理(MDL,dict_sys::mutex,dict_sys::rw_lock)
崩溃无法恢复
8.0新特性
支持事务性DDL,崩溃可以回滚,保证一致,
只保留一份数据字典信息,取消了frm数据字典
数据都放在的InnoDB表中
采用套锁机制,管理数据字典的并发访问(DML)
全新的plugin支持
8.0.17后加入clone plugin,更好的支持MGR InnoDB Clustre的节点管理
安全的加密方式改变
改变加密方式为caching_sha2_password
SSL 将支持到TLSv1.3版本.
用户管理及认证方式改变
改变授权方式
加入role角色权限
添加更多权限
cache&&Buffer的变化
取消了Query Cache
缓存的是查询的结果 会把你查询的语句做一个hash 结果做成key 如果你查询条件增加了 缓存就不会命中
mysql的查询缓存并非缓存执行计划,而是查询及其结果集,这就意味着只有相同的查询操作才能命中缓存,隐藏mysql查询命中率很低
oracle 缓存的是执行计划 减少了解过程.

mysql实例

mysqld守护进程 + Master Threa + Worker Threads + 预分配的内存

代码语言:javascript
复制
mysql的内存结构
global buffers(全局)
innodb_buffer_pool(可以设置物理内存的%50-%75):数据缓冲区
innodb_log_buffer:日志缓冲区
key_buffer
table_cache
session buffers(每个会话独立使用)
read_buffer
read_fnd_buffer
sort buffer
join buffer
tmp table
binlog_cache

代码语言:javascript
复制
mysql中的线程
master thread    作用核心后台进程,负责全局管理数据刷新和数据一致性处理
io thread        负责和磁盘io交互 (read io write io insert buffer log io) 相关参数inndbo_read_io_threads, inndbo_write_io_threads
Purge thread     作用 UNDO页回收 参数 innodb_purge_threads
page cleaner     作用 脏页刷新线程 默认1 最大64 参数 innodb_page_cleaners
other threads

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

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

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
云数据库 SQL Server
腾讯云数据库 SQL Server (TencentDB for SQL Server)是业界最常用的商用数据库之一,对基于 Windows 架构的应用程序具有完美的支持。TencentDB for SQL Server 拥有微软正版授权,可持续为用户提供最新的功能,避免未授权使用软件的风险。具有即开即用、稳定可靠、安全运行、弹性扩缩等特点。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档