【MySQL】MySQL是如何传输数据的?

1. 客户端-服务器通信(连接层)

MySQL 客户端(如 mysql 命令行、GUI 工具或应用程序)与 MySQL 服务器之间通过网络 或本地套接字进行通信。

1.1 本地和远程通信协议:TCP/IP(Transmission Control Protocol/Internet Protocol)

(1)TCP/IP是互联网的基础通信协议,用于 本地(LAN) 和 远程(WAN) 的数据传输。它包含:

  • IP(Internet Protocol,互联网协议):负责寻址和路由数据包。
  • TCP(Transmission Control Protocol,传输控制协议):提供可靠的端到端通信,确保数据不丢失、不重复、按顺序到达。

(2)使用IP 地址 & DNS 主机名来识别主机

  • IP 地址 :用于唯一标识网络中的设备(如 192.168.1.100)。
  • DNS(域名系统) :将主机名(如 mysql.example.com)解析为 IP 地址,方便访问远程服务器。

(3)使用TCP 端口号区分同一主机上的不同服务。

(4)本地通信:同一台主机内 进程之间的通信,常用于进程间通信(IPC) 或 测试网络服务。

  • 仅在 本机 上运行的进程间通信,不经过物理网卡。

  • 使用 回环地址(127.0.0.1) 进行通信。

  • 低延迟、高速、安全,不会经过外部网络。

  • 通过 Unix Socket 或 127.0.0.1:3306 进行连接。

    bash 复制代码
    mysql -u root -p -h 127.0.0.1 -P 3306

    如果使用 --host=localhost,MySQL 可能会使用 Unix 套接字连接,而不是 TCP。

(5)远程通信:不同设备间通过 TCP 进行通信,通常使用 公网 IP(如 8.8.8.8)或局域网 IP(如 192.168.1.100)。

  • 需要网络连接(局域网或互联网)。
  • 可能受到防火墙、NAT 限制。
  • 存在一定的网络延迟。
  • 可能需要身份验证、加密保护(如 SSH、TLS)。

1.2 本地通信协议:Socket

(1)Socket 主要用于同一台计算机上 的进程间通信(IPC),可以通过:

  • Unix 域套接字(UDS):不使用IP地址和端口, 基于 文件路径 通信(如 /tmp/mysqld.sock)。只在 Linux/macOS 可用(Windows 没有 UDS)。低延迟,高性能,比 TCP 更快。
  • 本地TCP套接字: 使用 127.0.0.1 作为 IP 地址。支持所有操作系统,性能稍低于 Unix 套接字
  • 本地UDP套接字: 使用 127.0.0.1 作 IP 地址,UDP 是无连接的协议,适用于实时通信(如游戏、本地日志传输)。适合小数据传输,但可能丢包。
  • 使用/var/lib/mysql/mysql.sock 套接字文件的示例:
bash 复制代码
 mysql -S /var/lib/mysql/mysql.sock -uroot -p
  • 使用默认套接字文件/tmp/mysql.sock 的示例:

    bash 复制代码
     mysql -uroot -p

    如果没有指定主机,mysql 假定-h localhost

1.3 SSL

连接层在可用时使用安全、加密的连接SSL。

  • 如果服务器主机上安装了OpenSSL,MySQL包安装程序将创建SSL密钥,安装程序调用mysql_ssl_rsa_setup 实用程序来创建密钥,如果从二进制存档安装,需要手动调用此实用程序。
  • 如果密钥可用,MySQL客户机将使用SSL,密钥位于数据目录中,将客户端密钥复制到远程客户端以启用加密的远程连接。
  • 如果SSL不可用,则连接将不加密,可以将服务器和客户机配置为强制使用SSL。

1.4连接线程

在 MySQL 默认模式 下,每个客户端连接都会创建一个 独立的服务器线程 来处理 SQL 语句。然而,在高并发场景下,这种模式会带来线程创建和销毁的开销,导致性能下降。

为了解决这个问题,MySQL 提供了 线程池(Thread Pool) ,它分离 了连接管理 和线程管理, 通过线程组(Thread Group) 共享线程资源,提高服务器的可扩展性和并发处理能力。

(1)线程池插件管理连接和服务器线程:

  • 线程池不会为每个连接创建独立线程,而是通过线程组(Thread Group)共享线程。
  • 连接请求进入线程池 等待调度 ,然后由可用线程 处理 SQL 语句。

(2)线程组(Thread Group):

  • 每个线程组 处理多个客户端连接,但 任何时刻只允许一个线程运行一个短时 SQL 语句。
  • 短时语句优先,避免长时间 SQL 语句阻塞其他查询。

(3)事务优先级管理:

  • 运行中的事务具有高优先级,保证事务一致性和响应速度。
  • 长时间运行的事务不会阻塞短语句,提高数据库吞吐量。
相关推荐
Lethehong4 小时前
Oracle 加个字段,目标库就报错?KFS 用“先拆后组“打通异构 DDL
数据库·oracle
Web极客码5 小时前
锁定真正的磁盘卡顿:我用 OpenCode 配合 eBPF 诊断 NVMe 队列深度延迟与 I/O 写放大
数据库·oracle
cspttty5 小时前
2027用户研究求职准备:应用统计学如何补齐研究设计与业务表达
大数据·数据库
roman_日积跬步-终至千里6 小时前
【数据Agent论文·查询与语义|05】Spider:为什么换一个数据库,模型就不会查了?
数据库·数据分析
猫咪很可爱7 小时前
Oracle RAC 启动失败排查:私网通信与内核参数优化实战
运维·数据库·oracle
XLYcmy7 小时前
《数字经济赋能城市低碳治理的路径研究检索报告》审阅与修改指导意见——基于完整检索报告体例的完整性诊断、学术规范核查与方法论纠偏 上
数据库·ai·chatgpt·文心一言·检索·知网·豆包
泡海椒7 小时前
JQuick-SQL 快速开始:注册内存表并执行查询
数据库·windows·sql
ss2737 小时前
PG实战笔记 | 09 PostgreSQL psql客户端基本操作
数据库·笔记·postgresql
电商API_180079052477 小时前
反向海淘多币种结算:汇率该在哪个时点被冻结
java·开发语言·数据库·跨境电商·1688 api
搞AI的金鱼8 小时前
skill agent workflow的区别
数据库