MySQL - 相关概念
连接
MySQL提供了两种连接方式:
- TCP/IP方式(本地、远程):
mysql -uroot -p123 -h 10.0.0.1 -P330
- Socket方式(仅本地)
mysql -uroot -p123 -S /tmp/mysql.sock
当我们本地连接MySQL的时候,默认用的是socket方式,一般在配置文件中有体现:
[root@cs /]# cat /etc/my.cnf [mysqld] user=mysql basedir=/opt/mysql datadir=/data/mysql server_id=6 port=3306 socket=/tmp/mysql.sock [mysql] socket=/tmp/mysql.sock prompt=3306 [\\d]>
如上socket
指向的/tmp/mysql.sock
文件就是socket文件,通过这个文件进行连接;我们也能在本地找到这个文件:
[root@cs /]# ll /tmp/mysql.sock srwxrwxrwx 1 mysql mysql 0 8月 14 16:28 /tmp/mysql.sock
实例
MySQL实例由以下几部分组成:
- MySQL后台守护进程
- Master Thread
- Work Thread
- 预分配的内存
一台物理机上,通常可以部署一个实例;当然为了最大化的利用硬件性能,也可以部署多个实例。
MySQL架构
MySQL架构总共四层:
-
首先,最上层的服务并不是MySQL独有的,大多数给予网络的客户端/服务器的工具或者服务都有类似的架构。比如:连接处理、授权认证、安全等。
-
第二层的架构包括大多数的MySQL的核心服务。包括:查询解析、分析、优化、缓存以及所有的内置函数(例如:日期、时间、数字和加密函数)。同时,所有的跨存储引擎的功能都在这一层实现:存储过程、触发器、视图等。
-
第三层包含了存储引擎。存储引擎负责MySQL中数据的存储和提取。服务器通过API和存储引擎进行通信。这些接口屏蔽了不同存储引擎之间的差异,使得这些差异对上层的查询过程透明化。存储引擎API包含十几个底层函数,用于执行“开始一个事务”等操作。但存储引擎一般不会去解析SQL(InnoDB会解析外键定义,因为其本身没有实现该功能),不同存储引擎之间也不会相互通信,而只是简单的响应上层的服务器请求。
-
第四层包含了文件系统,所有的表结构和数据以及用户操作的日志最终还是以文件的形式存储在硬盘上。
MySQL中一条SQL的执行过程:
-
由客户端向mysqld发送SQL语句
-
连接层
- 提供连接协议:TCP/IP、SOCKET
- 提供验证:用户、密码、IP、SOCKET
- 提供专用连接线程:接收SQL、返回结果,我们可以通过下面的语句来查看到当前有几个客户端连接:
-
SQL层:
- 接收上层传送过来的SQL语句
- 语法验证模块:验证语句语法,是否满足
SQL_MODE
- 语义检查:判断SQL语句的类型
- DDL:数据定义语言
- DCL:数据控制语言
- DML:数据操作语言
- DQL:数据查询语言
- .........
- 权限检查:用户对库表有没有相关权限
- 解析器:进行SQL预处理,产生执行计划
- 优化器:根据解析器得出多种执行计划,进行选择最优的执行计划
- 代价模型:资源(CPU、IO、MEM)的损耗评估性能情况
- 执行器:根据最优执行计划,执行SQL语句,产生执行结果,数据在磁盘的某个位置上
- 根据查询缓存(默认是关闭的),会使用redis、tair替代查询缓存功能
- 提供日志记录:binlog,默认是关闭的
-
存储引擎层(类似Linux中的文件系统):根据SQL层执行的结果,从磁盘上拿数据,将16进制的磁盘数据,交由SQL结构化成表,由连接层的专用线程返回给用户
逻辑结构
在MySQL中,逻辑结构由库和表组成,并且各自有各自的规范:
- 库:
- 库名称
- 库属性
- 表(二维表):
- 表名
- 表属性
- 列:列名、列属性
- 数据行,也叫记录
库的物理结构
库相当于目录(文件夹)
表的物理结构
在磁盘上,表的物理存储根据存储引擎的不同而有所不同,目前常用的有两种:
MyIASM:
- user.frm:存储列相关信息
- user.MYD:存储记录
- user.MYI:索引
INNODB:
- frm:存储列相关信息
- ibd:数据行和索引信息
如上示例是两种不同存储引擎的表的物理结构。
我们可以对应来理解:
- 数据库相当于文件夹。
- 数据表相当于文件夹内的Excel表。
- 记录相当于Excel表中的一行行数据。
只不过MySQL对这些有更严格的规范
常用的SQL分类
- DDL(Data Definition Language):数据定义语言,就是我们在创建表的时候用到的一些sql,比如说:CREATE、ALTER、DROP等。DDL主要是用在定义或改变表的结构,数据类型,表之间的链接和约束等初始化工作上。
- DCL(Data Control Language):数据控制语言,是用来设置或更改数据库用户或角色权限的语句,包括(grant,deny,revoke等)语句。这个比较少用到。
- DML(Data Manipulation Language):数据操作语言,就是我们最经常用到的 SELECT、UPDATE、INSERT、DELETE。 主要用来对数据库的数据进行一些操作。