客户端与服务器模型
Mysql是一个典型的C/S结构
Mysql的客户端有:
- Mysql
- mysqladmin
- mysqldump
- 图形化展示:
- SQLyog
- navicat
Mysql服务端的连接方式
- TCP/IP连接 (mysql -uroot -p123 -h10.0.0.51)
- Socket连接 (mysql -uroot -p123 -S /app/mysql/tmp/mysql.sock)
问题:
#以下几种方式属于什么连接方式
mysql -uroot -p123 // socket连接方式
mysql -uroot -p123 -h127.0.0.1 // TCP
mysql -uroot -p123 -hlocalhost // Socket
mysql -uroot -p123 -h10.0.0.51 -S /tmp/mysql.sock // TCP
mysql -uroot -p123 -S /tmp/mysql.sock -h10.0.0.51 // TCP
# 总结:
1)MySQL默认使用Socket连接,TCP连接需要建立三次握手,速度比Socket慢
2)不是只要-h就一定是TCP连接
3)当-h和-S一起出现时,如果-h指定的是IP地址,那么一定是TCP连接
MySQL服务端构成
什么是实例?
由 一个进程 + 多个线程 + 一个预分配的内存结构
1.MySQL的后台进程+线程+预分配的内存结构。
2.MySQL在启动的过程中会启动后台守护进程,并生成工作线程,预分配内存结构供MySQL处理数据使用
MySQLD服务器程序构成:
mysqld是一个守护进程但是本身不能自主启动:
[root@db01 ~]# mysql -uroot -poldboy123
[root@db01 ~]# select user,host,password from mysql.user;
mysqld程序的工作流程
连接层
- 提供了两种连接方式
- TCP
- socket
- 验证用户的合法性
- 权限
- 用户名
- 密码
- 验证黑白名单
- 验证主机和端口黑白名单
提供了一个和SQL层建立连接的专用线程
SQL层
- 验证主机和端口黑白名单
- 接收连接层传来的SQL语句
- 验证语法
- 验证语义
- DML(insert update delete)
- DDL(create database create table drop)
- DQL(select show call desc explain)
- DCL(grant revoke)
- DTL(Database Transaction Language)TCL Transaction Controller Language
- 解析器:解析后面的SQL语句
- 优化器:提供几种比较优化的执行方案
- 执行器:选择优化器提供的最优一种方案,去执行
- 提供一个与存储引擎出建立连接的线程
- 接收存储引擎层结构化成表的数据
- 如果有缓存,写缓存
- 记录日志(binlog)
存储引擎层
- 接收SQL层传来的SQL语句
- 去磁盘上取出SQL语句需要的数据
- 结构化成表格的形式返回给SQL层
Mysql的结构
逻辑结构
- 数据库管理员的所有操作对象(MySQL的资源)
- 库
- 表
- 真实数据
- 元数据
- 列(字段)
- 列名字(字段名)
- 数据类型
- 约束
- 是否为空
- 默认值
- 范围
- 注释
- 索引
- 其他属性
- 行数
- 大小
- 权限
物理结构:
最底层的物理数据,修改数据库目录就能对数据库造成影响
物理结构区别
## myisam frm:format
表结构:
[root@db01 data]# ll mysql/user*
-rw-rw---- 1 mysql mysql 10684 Jul 18 22:50 mysql/user.frm
-rw-rw---- 1 mysql mysql 236 Jul 19 10:53 mysql/user.MYD
-rw-rw---- 1 mysql mysql 2048 Jul 19 10:54 mysql/user.MYI
## innodb
[root@db01 data]# ll yl/yl_test*
-rw-rw---- 1 mysql mysql 8556 Jul 20 09:26 yl/yl_test.frm
-rw-rw---- 1 mysql mysql 98304 Jul 20 09:26 yl/yl_test.ibd
文件系统单位
Linux文件系统CentOS7:xfs
Linux文件系统CentOS6:ext4
Mysql | Linux |
---|---|
库 | 目录 |
show databse | ls -l/ |
user mysql | cd /mysql |
表 | 文件 |
show tables | ls |
二维表=元数据+真实数据 | 文件=文件名+文件属性 |
段:一个段,是由多个区组成的(一张表)
区:一个区,是由多个页组成的,64个页为一个区1024k=1M
页:最小单位,一页,16k