MySQL连接流程

本文详细介绍了MySQL的连接流程,包括客户端与服务端的交互、TCP/IP连接、身份验证,以及如何通过长连接优化性能。还讨论了InnoDB引擎的特点和内存管理,以及如何通过Navicat管理和解密密码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

MySQL连接流程

1.1 流程总览

连接时一开始的流程

1.2 过程解析

1)靠什么连接上?

答:客户端
一般我们安装MySQL是在安装MySQL Server也就是服务端 (https://dev.mysql.com/downloads/mysql/)
客户端 ⇒ MySQL 服务端

a 什么是客户端?

这里的客户端比较广义,包括了JDBC这类驱动、Navicat可视化工具、命令行工具等。
如果细分的话,驱动和客户端有点区别。

b 什么区别?

客户端:MySQL 客户端是独立的应用程序,用于直接与 MySQL 服务器进行交互。
驱动:是应用程序的一部分,用一套标准化接口提供程序内部的连接和操作能力(屏蔽内部细节)。
驱动详细的分为:

  1. 硬件驱动程序(提供一套标准化接口来帮助控制电脑硬件)
  2. 系统驱动程序(操作系统的一部分,提供标准化接口来帮助管理计算机核心功能,例如存储)
  3. 软件驱动程序 (用于软件以确保它能和系统的其他部分交互,例如JDBC)
    注:驱动是封装标准化接口方便与OS或者硬件交互
    有个类似的概念-引擎,是提供封装的标准化接口为软件的开发提供特定算法的核心库或者组件

个人的理解:

  1. 驱动:对操作硬件设备或OS这类,需要统一的API去下命令驱使它去动 (针对于数据库其实也算对硬盘的操作,只是高度屏蔽了细节,所以JDBC也叫驱动)
  2. 引擎:类似于发动机是摩托的一部分,引擎是提供标准化接口去提供一种能力,是软件的一部分,可以是以库或者组件的形式存在

2)为什么能连上?

通过进程间通信,例如:管道、TCP/IP
一般走网络连接都是通过 TCP/IP 的方式进行连接
⇒ server1的客户端 和 server2服务端的连接器 通过 TCP/IP 连接

3)连接的过程?

1 客户端连接

mysql -h 127.0.0.1 -P 3306 -u root -p

2 TCP/IP 连接
3 服务端连接器验证身份

  • 验证账号密码
  • 验证权限
  • 连接成功连接器会保存这个连接一段时间(超时无动作就断开)

问题:

连接比较复杂 ⇒ 所以推荐长连接 (连接完后有持续的请求,都在同一个连接)
mysql 执行过程中临时使用的内存是在连接对象 ⇒ 长连接后 mysql 内存涨很快

平衡的方案:

MySQL 5.7 之前可以定期断开长连接来做到两者的平衡
MySQL 5.7 之后,提供较大操作后,保持连接状态但资源初始化的操作

4)对于高性能可以调控的地方?如何调控?

  1. 从连接的角度看:查询波动可能是网络的原因 (重试解决)
  2. 从连接的角度看:查询慢可能是内存被疯狂挤占 (重置连接资源)
  3. 从服务端的角度看,查询慢可能是服务器系统的原因
    CPU
    a) MySQL的InnoDB引擎一般是在线事务处理的数据库应用
    b) 特点:并发量大、走索引的简单查询、复杂查询少、处理时间快
    c) 主要卡点不在CPU在IO,属于IO密集型
    d) 但多核CPU对于高并发的承接还是有帮助的
    内存
    a) 可以扩大,InnDB为例既缓存数据也缓存索引
    存储
    a) 通过固态硬盘来提升IO的速度

为了验证命令行的辛酸路程:

  1. 发现本地mysql没有bin目录,没法尝试命令行
  2. 回想起实验室主机安装了mysql想尝试(痛苦的开始)
  3. windows登录密码忘记了(长时间没登陆)
  4. 在尝试了所有可能的密码之后放弃了(a thousand years later 泪目)
  5. 回想起笔记本很久之前远程访问过实验室主机(通过Windows自带的远程桌面连接)
  6. 前提:连接的时候需要被访问电脑的开机账号密码 → 尝试是否还保留
  7. 登录成功!泪目
  8. 但怎么查看密码?(二度痛苦)
  9. 开始搜索 …… (a thousand years later)
  10. 发现这个的方法2奏效: https://zhuanlan.zhihu.com/p/654009956 ( nice! )
  11. 再然后 emmm 主机的mysql 密码是啥? (三度痛苦)
  12. 开始搜索 …… (a thousand years later)
  13. 一直在往MySQL搜 不断的失败………
  14. 突然想起来 Navicat 之前保存过
  15. 一尝试,连接成功!(nice!)
  16. 但 navicat的密码保存在哪里?
  17. 开始搜索 …… (a thousand years later)
  18. 发现下述的方式奏效,连接成功后可以在navicat直接带密码导出 (文件 → 导出连接 → 带密码)
    https://www.python100.com/html/80471.html
    https://blog.youkuaiyun.com/m0_46317063/article/details/128216684
  19. 但密码加密了(导出的文件: connections.ncx)
# 密码解密程序 是这个包: pip install pycryptodome
from Crypto.Cipher import AES

def DecryptNavicat(data):
    aes = AES.new('libcckeylibcckey'.encode(), AES.MODE_CBC, iv='libcciv libcciv '.encode())
    text = aes.decrypt(bytes.fromhex(data))
    # 删掉填充的字符
    return text[0:-text[-1]].decode('utf-8')

if __name__ == '__main__':
    print(DecryptNavicat('文件中的加密密码'))
  1. 得到密码,命令行运行成功 (泪流不止!)
    mysql -h 127.0.0.1 -P 3306 -u root -p
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值