MySQL 默认连接数

一、MySQL 默认连接数概述

MySQL 的 max_connections 是数据库服务器允许的最大并发连接数,直接影响系统性能和资源利用率。

二、MySQL 默认连接数的版本差异

版本 默认最大连接数 上限值
MySQL 5.0 100 16384
MySQL 5.1 200(小版本不同) 100000
MySQL 5.5/5.6/5.7 151 100000
MySQL 8.0 151 100000

验证方法:

sql 复制代码
SHOW VARIABLES LIKE 'max_connections';

三、核心概念与命令详解

1. 查看当前连接数与配置

  • 最大连接数 :

    sql 复制代码
    SHOW VARIABLES LIKE 'max_connections';
  • 当前活跃连接数 :

    sql 复制代码
    SHOW STATUS LIKE 'Threads_connected';
  • 连接使用率 :

    sql 复制代码
    SELECT 
      (SELECT VARIABLE_VALUE FROM performance_schema.global_status WHERE VARIABLE_NAME = 'Threads_connected') AS current_connections,
      (SELECT VARIABLE_VALUE FROM performance_schema.global_variables WHERE VARIABLE_NAME = 'max_connections') AS max_connections,
      ROUND(
        (SELECT VARIABLE_VALUE FROM performance_schema.global_status WHERE VARIABLE_NAME = 'Threads_connected') / 
        (SELECT VARIABLE_VALUE FROM performance_schema.global_variables WHERE VARIABLE_NAME = 'max_connections') * 100, 
        2
      ) AS connection_usage_rate;

2. 详细连接信息

  • 查看所有连接状态 :

    sql 复制代码
    SHOW PROCESSLIST;
  • 按用户分组统计连接数 :

    sql 复制代码
    SELECT user, COUNT(*) AS connections FROM information_schema.processlist GROUP BY user;
  • 空闲连接数 :

    sql 复制代码
    SELECT COUNT(*) FROM information_schema.processlist WHERE command = 'Sleep';

四、连接数调整的实战方法

1. 通过配置文件永久修改

  • Linux/Unix/macOS :

    修改 /etc/my.cnf 或 /etc/mysql/my.cnf

    ini 复制代码
    [mysqld]
    max_connections = 1000
    wait_timeout = 300
    interactive_timeout = 300
  • Windows :

    修改安装目录下的 my.ini

    ini 复制代码
    [mysqld]
    max_connections = 1000
    wait_timeout = 300
  • 重启服务:

    bash 复制代码
    # Linux/Unix/macOS
    sudo systemctl restart mysql
    
    # Windows
    net stop MySQL80 && net start MySQL80

2. 动态调整(临时生效)

sql 复制代码
SET GLOBAL max_connections = 1000;

五、连接池优化:HikariCP 的 YML 配置详解

在 Spring Boot 项目中,HikariCP 是默认的连接池实现。以下是一个完整的 application.yml 配置示例:

yaml 复制代码
spring:
  datasource:
    url: jdbc:mysql://localhost:3306/mydb
    username: root
    password: password
    hikari:
      # 最大连接数
      maximum-pool-size: 20
      # 最小空闲连接
      minimum-idle: 5
      # 连接超时时间(毫秒)
      connection-timeout: 30000
      # 空闲连接超时时间(毫秒)
      idle-timeout: 600000
      # 连接最大存活时间(毫秒)
      max-lifetime: 1800000
      # 连接健康检查
      connection-test-query: SELECT 1
      # 预热连接数
      initialization-fail-timeout: 1
      # 自动提交
      auto-commit: true
      # 池大小调整的等待时间(毫秒)
      pool-name: MyHikariPool

3. 关键参数说明

参数名 说明 推荐值
maximum-pool-size 最大连接数 20~100(业务决定)
minimum-idle 最小空闲连接数 5~10
connection-timeout 连接超时时间(毫秒) 30000
idle-timeout 空闲连接超时时间(毫秒) 600000
max-lifetime 连接最大存活时间(毫秒) 1800000
connection-test-query 健康检查 SQL SELECT 1

六、连接池监控与 Prometheus 集成

1. 通过 JMX Exporter 监控 HikariCP

配置步骤:
  1. 下载 JMX Exporter

    从 JMX Exporter GitHub 下载 jmx_prometheus_javaagent-*.jar。

  2. 创建配置文件 jmx_config.yaml

    yaml 复制代码
    rules:
    - pattern: "com.zaxxer.hikari<type=Pool>(?<poolName>[^:]+):(?<attributeName>.+)"
      name: "hikaricp_${poolName}_${attributeName}"
      type: GAUGE
      help: "Metrics from HikariCP connection pool"
  3. 启动应用时加载 JMX Exporter

    bash 复制代码
    java -javaagent:/path/to/jmx_prometheus_javaagent.jar=12345:/path/to/jmx_config.yaml -jar your-app.jar
  4. Prometheus 配置抓取目标

    yaml 复制代码
    scrape_configs:
    - job_name: 'hikaricp'
      static_configs:
      - targets: ['localhost:12345']

2. Grafana 面板指标

  • 活跃连接数 :hikaricp_HikariPool_activeConnections
  • 空闲连接数 :hikaricp_HikariPool_idleConnections
  • 等待线程数 :hikaricp_HikariPool_threadsAwaitingConnection
  • 总连接数 :hikaricp_HikariPool_totalConnections

七、高并发场景下的连接管理策略

1. Web 应用场景

  • 问题:高并发下连接数耗尽。
  • 解决方案 :
    • 连接池 + 缓存:减少直接数据库访问(如 Redis 缓存高频数据)。
    • 读写分离:通过主从复制分担写压力。
    • 异步任务:复杂操作通过队列(如 Kafka)异步处理。

2. 数据分析场景

  • 需求:短时间大量复杂查询。
  • 优化策略 :
    • 限制单次查询连接数 :设置 max_connections_per_hour。
    • 批处理:合并多个查询为批量操作。

八、常见问题与解决方案

1. 错误:Too many connections

  • 原因 :达到 max_connections 限制。
  • 解决方法 :
    1. 增加 max_connections。
    2. 优化连接池配置(减少空闲连接)。
    3. 使用连接池 + 异步处理。

2. 连接泄漏

  • 现象:连接未释放导致资源浪费。
  • 解决方案 :
    • 代码规范 :使用 try-with-resources 自动关闭资源。
    • 设置超时 :合理配置 wait_timeout 和 idle-timeout。

九、扩展知识:MySQL 连接数调优

1. 资源限制检查

  • 内存消耗 :每个连接需分配线程和缓存,增加 max_connections 会显著增加内存占用。

  • 操作系统限制 :检查 ulimit 配置:

    bash 复制代码
    ulimit -n  # 查看当前限制
    ulimit -n 65535  # 临时修改限制

2. 连接池性能调优

  • 预热连接:启动时预先创建部分连接,减少首次请求延迟。
  • 动态扩容:根据负载动态调整连接池大小(需结合监控系统)。

十、总结

1. 总结

  • 默认值:MySQL 5.5+ 默认为 151,需根据业务需求调整。
  • 调整方法:优先通过配置文件修改,结合 HikariCP 优化。
  • 监控 :定期检查 Threads_connected 和 SHOW PROCESSLIST。

2. Java 开发最佳实践

  • 连接池配置:使用 YML 格式统一管理,避免硬编码。
  • 资源管理 :使用 try-with-resources 自动关闭连接。
  • 监控集成:通过 Prometheus + Grafana 实时监控连接池状态。

十一、附录:常用命令速查表

命令 功能
SHOW VARIABLES LIKE 'max_connections'; 查看最大连接数配置
SHOW STATUS LIKE 'Threads_connected'; 查看当前活跃连接数
SHOW PROCESSLIST; 查看所有连接的详细信息
SET GLOBAL max_connections = 1000; 临时调整最大连接数
SELECT * FROM information_schema.processlist WHERE command = 'Sleep'; 查看空闲连接
相关推荐
刘胡子大叔13 小时前
MySQL 升到 8.4 前的兼容性自检清单
mysql
IT古董14 小时前
《FDE前沿部署工程师实战教程》33 - Enterprise AI Observability:从Agent Trace到全链路智能运维
数据库·人工智能
for_ever_love__14 小时前
MySQL 主从复制讲透:binlog 原理、搭建步骤与读写分离
java·数据库·mysql·binlog·读写分离·原理·主从复制
Nturmoils18 小时前
GROUP BY 先别想当然,查汇总前把规则跑清楚
数据库
最笨的羊羊18 小时前
Oceanbase数据库系列之:向量数据库核心知识
数据库·oceanbase
fish_xk19 小时前
mysql中的表的约束
数据库·mysql
谢亮_vipxieliang19 小时前
Go Channel 高级模式——从底层原理到扇出扇入实战
java·数据库·golang
ggaofeng20 小时前
自己编写邮件服务器和客户端
数据库
java1234_小锋20 小时前
【技术专题】Mysql8 数据库 - Mysql8 添加,更新,删除数据
数据库·mysql
PaperData20 小时前
2015-2024年各省绿色贸易数据
数据库