文章目录
- 1 MySQL 8.0 体系结构介绍
- 2 MySQL 8.0 Server层结构
- —2.1 客户端/服务端模型
- ——2.1.1 Connectors
- ——2.1.2 MySQL Server
- —2.2 MySQL 8.0的"新姿势"
- ——2.2.1 元数据Metadata 结构变化
- ——2.2.2 全新的Plugin支持
- ——2.2.3 安全加密方式改变
- ——2.2.4 用户管理及认证方式改变
- ——2.2.5 支持原子性DDL
- ——2.2.6 Cache && Buffer的变化
- —2.3 实例结构
- ——2.3.1MySQL 的内存结构
- ——2.3.2 MySQL 中的线程
- —2.4 MySQL SQL语句处理逻辑及源码结构
- ——2.4.1 连接层
- ——2.4.2 SQL层
- ——2.4.3 存储引擎层
- ——2.4.4 统计信息
- 3. MySQL 8.0 存储引擎结构
- —3.1 MySQL系统结构
- —3.2 MySQL表宏观物理结构
- —3.3 MySQL表的微观物理结构
- —3.4 相关问题
1 MySQL 8.0 体系结构介绍
2 MySQL 8.0 Server层结构
—2.1 客户端/服务端模型
——2.1.1 Connectors
MySQL Protocol
1.Socket (Unix Scoket)本地
mysql -uroot -p123 -S /tmp/mysql.sock
2.TCP/IP(远程)
mysql -uroot -p123 -h 10.0.0.51 -P3306
3.API (应用程序、开发)
Native API
C、PHP、JDBC、ODBC、.NET、Python、Go...
——2.1.2 MySQL Server
MySQL Protocol 1.Socket (Unix Scoket)本地 mysql -uroot -p123 -S /tmp/mysql.sock 2.TCP/IP(远程) mysql -uroot -p123 -h 10.0.0.51 -P3306 3.API (应用程序、开发) Native API C、PHP、JDBC、ODBC、.NET、Python、Go...
——2.1.2 MySQL Server
Management Service && Utilties
Metadata (NEW!!) Plugins(NEW!!) Security (NEW!!) Backup && Restore (NEW !!) Replication (NEW!!) Cluster(NEW!!) Administration Configuration Migration
Connection Management
Authentication (NEW!!) Thread Reuse Connection Limit Check Memory
SQL Interface
DDL(NEW!!) DML procedures function(NEW!!) view triggers JSON (NEW!!)
Parser
Query translation Object privileges
Optimizer (NEW!!)
Explain Statistics
Cache && Buffers(NEW!!)
Engines
InnoDB
—2.2 MySQL 8.0的"新姿势"
——2.2.1 元数据Metadata 结构变化
- 5.7 版本问题
- 两套数据字典信息(Server层 oldguo.frm,InnoDB 数据字典) - DDL无原子化 - frm和innodb层会出现不一致 - 并发处理需要小心处理(MDL,dict_sys::mutex,dict_sys::rw_lock) - 崩溃无法恢复 drop table a,c ;
- 8.0 变化
- 支持事务性DDL,崩溃可以回滚,保证一致。 drop table a,c; - 保留一份数据字典信息,取消frm数据字典。 - 数据字典存放至InnoDB表中 - 采用套锁机制,管理数据字典的并发访问(MDL)
——2.2.2 全新的Plugin支持
- 8.0.17+ 加入Clone Plugin,更好的支持MGR,InnoDB Cluster的节点管理
——2.2.3 安全加密方式改变
- 改变加密方式为caching_sha2_password
- SSL 将支持到 TLSv1.3 版本。
——2.2.4 用户管理及认证方式改变
- 改变授权管理方式(两个SQL先创建用户,后授权)
create user oldguo@'10.0.0.%' identified by .,..
- 加入role角色管理
- 添加更多权限
——2.2.5 支持原子性DDL
——2.2.6 Cache && Buffer的变化
- 取消Query Cache
- 改变加密方式为caching_sha2_password - SSL 将支持到 TLSv1.3 版本。
——2.2.4 用户管理及认证方式改变
- 改变授权管理方式(两个SQL先创建用户,后授权)
create user oldguo@'10.0.0.%' identified by .,..
- 加入role角色管理
- 添加更多权限
——2.2.5 支持原子性DDL
——2.2.6 Cache && Buffer的变化
- 取消Query Cache
——2.2.6 Cache && Buffer的变化
- 取消Query Cache
—2.3 实例结构
——2.3.1MySQL 的内存结构
Global buffres:所有线程共享使用内存,innodb_buffer_pool 是最大的内存,可以设置50-75%物理内存,数值太高会经常触发OOM;innodb_log_buffer数据缓冲区;
Session buffer:会话级别内存
——2.3.2 MySQL 中的线程
公司:老板(启动的进程)+经理(主线程)+员工(其他线程)+办公室 实例: mysqld + Master Thread + Worker Threads + MEM
—2.4 MySQL SQL语句处理逻辑及源码结构
——2.4.1 连接层
提供连接协议、验证、提供专用连接线程
mysql> use mysql
mysql> show tables;
| columns_priv
| db
| procs_priv
| proxies_priv
| tables_priv
| user
——2.4.2 SQL层
预处理(lex):语法语义权限检查
解析(yacc):AST抽象语法树
优化:逻辑优化基于优化器算法根据关系代数的等价转换,物理优化会基于统计信息和优化器算法生成执行计划explain
——2.4.3 存储引擎层
负责和磁盘交互
——2.4.4 统计信息
一条SQL 语句,昨天运行好好的(0.01秒),突然变慢了(2Min)?为什么?
统计信息不准确造成,不走索引造成的。
统计信息记录的是,表的状态信息,比如表名、数据行、数据分布、索引状态信息,
统计信息是MySQL定期收集而来的,同过一些参数指标控制。不是实时收集的。
mysql.innodb_index_stats
mysql.innodb_table_stats
mysql> analyze table world.city;
mysql> optimize table world.city;
8.0 默认取消了QC
3. MySQL 8.0 存储引擎结构
类似于,Linux操作系统中的文件系统,Ext4 XFS
8.0.1 ---> 8.0.19
8.0.1 ---> 8.0.19
—3.1 MySQL系统结构
—3.2 MySQL表宏观物理结构
数据行(记录) + 元数据(表属性、表的列(列属性)、表名) 8.0 表存储方式 : 每张表的数据都存储在ibd中 5.7 表的存储方式: 数据行 ibd 元数据: frm + ibdata1 由此可以做到DDL原子性,Online DDL 做表结构变更,删列加列等操作更快速。
—3.3 MySQL表的微观物理结构
page: 数据页,默认16KB。InnoDB最小的IO单元。 extent:区、簇。最小的存储分配单元。默认1M,64个数据页组成。 https://dev.mysql.com/doc/refman/8.0/en/glossary.html#glos_page_size
—3.4 相关问题
1.一个raid阵列卡最多能做几组raid?需要多张raid卡冗余吗? 2组,os和数据,不需要冗余。 2.MySQL的查询缓存并非缓存执行计划,而是查询及其结果集,这就意味着只有相同的查询才能命中缓存, 因此MySQL的查询缓存命中率很低。一般关闭。 select * from t1 where id=1; ----> hash : 结果 select * from t1 where id= and name ='zs'; ---》 hash XXXX innodb_page_size 是用来调整page 大小的,但是只能在初始化时修改。 3.数据页调大了,可以提高性能,但是MySQL最好做TP。AP 业务模型不是最优的。 TP 数据页16KB AP 数据页64KB 4.如果我删除了某些页的数据,造成不连续,会降低查询性能吗? delete 数据。空间不会立即释放。碎片回收。 统计信息不准。 重建索引或者重新收集统计信息,转储表数据。 alter table t1 engine=innodb; analyze table t1 ; optimize table t1;