mysql的查询更新流程
1.mysql基本的架构层次
mysql的架构可以分为三层:连接层、服务层、存储引擎层
- 连接层
- 负责与客户端之间进行连接
- 进行鉴权和权限控制
- 服务层
- 查询缓存的读写
- 对sql进行词法分析、语法分析、预处理
- 对sql进行优化
- 调用存储引擎执行sql
- 存储引擎层
- 存储数据到内存或者磁盘
- 提供读写数据的接口
2.mysql的查询流程
mysql执行一条查询语句,有那么几个步骤:
查询步骤 | 对应mysql架构层次 |
---|---|
1. 建立连接 | 连接层 |
2. 查询是否有缓存 | 服务层 |
3. sql解析 | 服务层 |
4. sql预处理 | 服务层 |
5. sql优化 | 服务层 |
6. 执行引擎处理执行计划 | 服务层 |
7. 存储引擎读写数据 | 存储引擎层 |
2.1 步骤一:建立连接
和一个中间件连接,我们会考虑一下几点:
- 连接协议
- 数据的格式
- 连接的最大允许数量
- 如果是长连接,还需要考虑连接超时时间
- 数据包最大允许的容量
2.1.1连接的协议
平常我们说的协议,常见的比如有http、webservice、tcp,mysql的话,包含以下几种协议:
1. TCP/IP协议
这个是最常用的协议,会使用的场景eg:
- 我们用jdbc去连接mysql数据库
- mysql命令通过-h参数指定了目标地址
2. unix socket协议
这个是一种进程间通信的协议,会使用的场景eg:
- 当mysql和客户端在同一台linux服务器上时,用mysql命令连接
3. 其它协议(命名管道、共享内存)
其它的这2种协议,都只跟windows相关,但是生产环境的时候,无论是我们的程序,还是mysql服务端,都很少部署在windows上,所以我也就不去了解了
ps: 可能有人会疑惑,为什么没有socket协议?因为socket其实并不是一个协议,而是一套接口,可以方便我们使用tcp/ip协议
2.1.2数据的格式
数据格式,常见的比如有json、xml
mysql的话,既不是json,也不是xml,而是一个普通的tcp包,大概是这样的一个格式:
2.1.3连接的最大允许数量
2.1.3.1查看当前连接数
-- 查看连接相关的信息
show global status like "Thread%"
-- 结果:
Threads_cached 2
Threads_connected 2
Threads_created 4
Threads_running 1
-
Threads_cached:
缓存中的线程连接数
。
eg: navicat刚打开软件,且有1个tab已经打开的时候,如果把那个tab关闭,connected就会-1,cached会+1,如果再打开1个会话,发现cached会-1,connected会+1,created不变 -
Threads_connected:
当前打开着的连接数
。
eg: cached的数量不是0的情况下,新打开1个navicat会话,就会增加+1 -
Threads_created :
历史一共创建的线程数
-
Threads_running:
非睡眠状态的连接数,通常指并发连接数
。
eg: navicat打开1个会话,然后执行 select sleep(30),发现running的数量就会+1
2.1.3.2修改最大连接数
-- 查看最大连接数:
show variables like "max_connections";
-- 结果:151
mysql默认的最大连接数量是151,如果要修改最大连接数:
法1:执行sql命令修改
-- ps: 这种方式重启后就会失效
set global max_connections = 200
法2:修改配置
mysql的配置文件中,追加一行配置max_connections=300
,这种方式可以永久修改。windows环境,对应my.ini
文件,然后重启mysql服务即可生效;linux中的docker环境,对应 /etc/mysql/mysql.conf.d/mysqld.cnf
文件,修改好了重启docker容器
2.1.4连接超时时间
查看当前连接的保持时间:
show processlist;
定位当前慢查询的sql语句:
-- 这里有个t_user表,有240w数据,交叉连接查询,就可以测试慢查询
select * from(
SELECT * FROM t_user
where age > 2
)t1, t_user t2
where t1.age = t2.age
-- 通过Info字段,就能知道,Time很长的那个连接,当前在执行的sql是啥
show processlist;
查看超时时间参数
超时时间有2种:
- 交互式连接,eg: 使用jdbc去连接