mysql的查询更新流程

1.mysql基本的架构层次

mysql的架构可以分为三层:连接层、服务层、存储引擎层

  1. 连接层
    • 负责与客户端之间进行连接
    • 进行鉴权和权限控制
  2. 服务层
    • 查询缓存的读写
    • 对sql进行词法分析、语法分析、预处理
    • 对sql进行优化
    • 调用存储引擎执行sql
  3. 存储引擎层
    • 存储数据到内存或者磁盘
    • 提供读写数据的接口

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去连接
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值