于2021年1月20日重新编辑
MySQL基于CS架构
mysql分为服务端和客户端,服务端仅一个,而客户端可以有多个,每个shell都能算一个单独的客户端. 而服务端也设置了默认的最大连接数,一般是151,可以自己调节数量。
两种连接方式
#TCP/IP方式(远程、本地):
$ mysql -uroot -p123 -h 10.154.0.111 -P3306
#Socket方式(仅本地):
$ mysql -uroot -p123 -S /tmp/mysql.sock
实例
实例 = mysqld后台守护进程+Master Thread +干活的Thread+预分配的内存
相当于公司=老板+经理+员工+办公室
mysql的体系结构
连接层
(1)提供连接协议:TCP/IP 、SOCKET
(2)提供验证:用户、密码,IP,SOCKET
(3)提供专用连接线程:接收用户SQL,返回结果
#通过以下语句可以查看到连接线程基本情况
mysql> show processlist;
SQL层
(1)接收上层传送的SQL语句
(2)语法验证模块:验证语句语法,是否满足SQL_MODE规范
(3)语义检查:判断SQL语句的类型
DDL :数据定义语言
DCL :数据控制语言
DML :数据操作语言
DQL: 数据查询语言
...等等
(4)权限检查:用户对库表有没有权限。
(5)解析器:对语句执行前,进行预处理,生成多种执行方案。
(6)优化器:根据解析器得出的多种执行计划,进行判断,选择最优的执行计划。代价模型:资源(CPU IO MEM)的耗损评估性能好坏。
(7)执行器:根据最优执行计划,执行SQL语句,产生执行结果。执行结果:在磁盘的某个位置上。
(8)提供查询缓存(默认是没开启的),会使用redis tair替代查询缓存功能。
(9)提供日志记录(日志管理章节):binlog,默认是没开启的。
存储引擎层
负责根据SQL层执行的结果,从磁盘上读取数据。将16进制的磁盘数据返回SQL层,结构化生成二维表,
再转给连接层的专用线程返回给用户,最终展示出来结果。
mysql逻辑结构
物理存储结构
数据库的物理存储结构
登录mysql创建数据库test
$ mysql -uroot -p
mysql> create database test;
mysql> exit
$ cd /usr/local/mysql-5.7.26/data
会发现创建的数据库test其实是一个目录
表的物理存储结构
#进入mysql数据库
$ cd mysql
#查看user表
$ ll user.*
-rw-r-----. 1 mysql mysql 10816 Jan 17 07:15 user.frm
-rw-r-----. 1 mysql mysql 340 Jan 17 07:15 user.MYD
-rw-r-----. 1 mysql mysql 4096 Jan 17 07:15 user.MYI
MyISAM(一种引擎)的表:
-rw-r----- 1 mysql mysql 10816 Apr 18 11:37 user.frm #存储列相关信息(列,列属性)
-rw-r----- 1 mysql mysql 396 Apr 18 12:20 user.MYD #存储数据行(每一行都是数据)
-rw-r----- 1 mysql mysql 4096 Apr 18 14:48 user.MYI #索引信息
InnoDB(默认的存储引擎)的表:
-rw-r----- 1 mysql mysql 8636 Apr 18 11:37 time_zone.frm #存储列相关信息
-rw-r----- 1 mysql mysql 98304 Apr 18 11:37 time_zone.ibd #存储数据行+索引信息
$ cd /usr/local/mysql-5.7.26/data
$ ll ibdata1
-rw-r-----. 1 mysql mysql 12582912 Jan 17 07:23 ibdata1 #InnoDB数据字典信息,也就是元数据
参考资料: ibdata文件理解
表的段、区、页
段:也就是一个表,包含一个或多个区
区:一个区包含64个连续的页,每个页16k大小,64个页共1M
页:最小的存储单元,默认16k
学习来自:郭老师博客,老男孩深标DBA课程 第二章