MySQL连接流程
1.1 流程总览
1.2 过程解析
1)靠什么连接上?
答:客户端
一般我们安装MySQL是在安装MySQL Server也就是服务端 (https://dev.mysql.com/downloads/mysql/)
客户端 ⇒ MySQL 服务端
a 什么是客户端?
这里的客户端比较广义,包括了JDBC这类驱动、Navicat可视化工具、命令行工具等。
如果细分的话,驱动和客户端有点区别。
b 什么区别?
客户端:MySQL 客户端是独立的应用程序,用于直接与 MySQL 服务器进行交互。
驱动:是应用程序的一部分,用一套标准化接口提供程序内部的连接和操作能力(屏蔽内部细节)。
驱动详细的分为:
- 硬件驱动程序(提供一套标准化接口来帮助控制电脑硬件)
- 系统驱动程序(操作系统的一部分,提供标准化接口来帮助管理计算机核心功能,例如存储)
- 软件驱动程序 (用于软件以确保它能和系统的其他部分交互,例如JDBC)
注:驱动是封装标准化接口方便与OS或者硬件交互
有个类似的概念-引擎,是提供封装的标准化接口为软件的开发提供特定算法的核心库或者组件
个人的理解:
- 驱动:对操作硬件设备或OS这类,需要统一的API去下命令驱使它去动 (针对于数据库其实也算对硬盘的操作,只是高度屏蔽了细节,所以JDBC也叫驱动)
- 引擎:类似于发动机是摩托的一部分,引擎是提供标准化接口去提供一种能力,是软件的一部分,可以是以库或者组件的形式存在
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)对于高性能可以调控的地方?如何调控?
- 从连接的角度看:查询波动可能是网络的原因 (重试解决)
- 从连接的角度看:查询慢可能是内存被疯狂挤占 (重置连接资源)
- 从服务端的角度看,查询慢可能是服务器系统的原因
CPU
a) MySQL的InnoDB引擎一般是在线事务处理的数据库应用
b) 特点:并发量大、走索引的简单查询、复杂查询少、处理时间快
c) 主要卡点不在CPU在IO,属于IO密集型
d) 但多核CPU对于高并发的承接还是有帮助的
内存
a) 可以扩大,InnDB为例既缓存数据也缓存索引
存储
a) 通过固态硬盘来提升IO的速度
为了验证命令行的辛酸路程:
- 发现本地mysql没有bin目录,没法尝试命令行
- 回想起实验室主机安装了mysql想尝试(痛苦的开始)
- windows登录密码忘记了(长时间没登陆)
- 在尝试了所有可能的密码之后放弃了(a thousand years later 泪目)
- 回想起笔记本很久之前远程访问过实验室主机(通过Windows自带的远程桌面连接)
- 前提:连接的时候需要被访问电脑的开机账号密码 → 尝试是否还保留
- 登录成功!泪目
- 但怎么查看密码?(二度痛苦)
- 开始搜索 …… (a thousand years later)
- 发现这个的方法2奏效: https://zhuanlan.zhihu.com/p/654009956 ( nice! )
- 再然后 emmm 主机的mysql 密码是啥? (三度痛苦)
- 开始搜索 …… (a thousand years later)
- 一直在往MySQL搜 不断的失败………
- 突然想起来 Navicat 之前保存过
- 一尝试,连接成功!(nice!)
- 但 navicat的密码保存在哪里?
- 开始搜索 …… (a thousand years later)
- 发现下述的方式奏效,连接成功后可以在navicat直接带密码导出 (文件 → 导出连接 → 带密码)
https://www.python100.com/html/80471.html
https://blog.youkuaiyun.com/m0_46317063/article/details/128216684 - 但密码加密了(导出的文件: 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('文件中的加密密码'))
- 得到密码,命令行运行成功 (泪流不止!)
mysql -h 127.0.0.1 -P 3306 -u root -p