MySQL性能优化之max_connections配置参数浅析

什么是max_connections

max_connections是MySQL数据库中的一个配置参数,用于设置同时连接到MySQL服务器的最大客户端数量。一旦超过这个数量,新的客户端连接将无法被接受并返回错误信息。

如何设置max_connections

方法一:

可以通过

1
set GLOBAL max_connections=100;

命令将最大连接数设置为100,此方法是即时生效的,不需要重启mysql服务。

需注意的是,要通过root权限的mysql帐号才能操作,否则会报“1227 - Access denied; you need (at least one of) the SUPER
privilege(s) for this operation”的错误。

同时,设置max_connections最小值为1。

方法二

在MySQL配置文件my.cnf中,可以通过以下配置来设置max_connections参数的值:

1
2
[mysqld]
max_connections=100

上述例子将max_connections参数的值设为100。

如何确定max_connections的最佳值

max_connections的值设置得过低会导致连接被拒绝的错误,设置得过高会导致系统资源紧张和性能下降。

一般来说,max_connections的适当值可以通过以下公式计算:

1
max_connections=(Available RAM - Global Buffers - Other Programs RAM) / per-connection_buffers

其中,Available RAM指可用的内存,Global Buffers指MySQL服务器缓存的内存,Other Programs RAM
指其他程序正在使用的内存,per-connection_buffers指每个连接需要使用的缓存大小。

示例1:计算max_connections的最佳值

MySQL 终端中使用类似于此 **SHOW VARIABLES LIKE '%buffer%';** 的查询找到了相关变量。

image-20231110180317731

具体变量内容:
计算公式:
1
max_connections = (Available RAM – Global Buffers) / Thread Buffers

Available RAM = 8201199616

image-20231110165058000

Global Buffers Size Thread Buffers Size
key_buffer_size 8388608 sort_buffer_size
innodb_buffer_pool_size 134217728 myisam_sort_buffer_size
innodb_log_buffer_size 16777216 read_buffer_size
innodb_additional_mem_pool_size 8388608(默认值) join_buffer_size
net_buffer_size read_rnd_buffer_size
query_cache_size thread_stack

示例2:优化max_connections性能

可以通过以下方法进一步优化max_connections的性能:

1. 调整MySQL服务的最大打开文件数
1
2
[mysqld]
open_files_limit=65535

上述例子将MySQL服务的最大打开文件数设为65535。

2. 使用连接池

可以使用连接池来重复使用现有的数据库连接,减少创建和销毁连接的开销。

可以使用第三方的连接池工具,如C3P0、Druid等。

MySQL 连接相关变量的含义
**max_connections:**MySQL 允许的最大并发连接数。默认值通常为 151。超过此限制的连接请求将被拒绝。

max_user_connections:每个用户允许的最大连接数。默认情况下,此限制没有被强制执行,允许用户使用 max_connections
的最大值。可以通过设置来强制限制用户的连接数。

threads_connected:当前已经建立的连接数。该变量表示当前活动的连接数,包括客户端和内部线程。

threads_running:当前正在运行的线程数。这包括正在执行查询或其他操作的线程。

wait_timeout:客户端连接在未活动一段时间后被关闭之前的等待时间。默认值为 28800 秒(8 小时)。如果连接在该时间段内没有活动,则服务器将自动断开连接。

interactive_timeout:与 wait_timeout 类似,但仅适用于交互式连接。如果连接被标记为交互式,则会使用此值来确定在未活动一段时间后关闭连接之前的等待时间。

connect_timeout:客户端连接到服务器时的超时时间。如果连接尝试在此时间内未能成功建立,则会超时。

**back_log:**MySQL 服务器允许等待连接的请求队列的最大长度。当所有连接数已用完时,新的连接请求将进入等待队列。默认值通常为
50。

**max_connect_errors:**在服务器拒绝客户端连接之前允许的最大错误连接数。如果客户端尝试建立连接的次数超过此限制,则服务器将拒绝进一步的连接请求。

max_allowed_packet:允许的最大数据包大小。这适用于发送给服务器的单个查询或响应的大小限制。

**net_read_timeout:**从网络中读取数据时的超时时间。如果在此时间内没有接收到新数据,则连接可能会被关闭。

**net_write_timeout:**向网络写入数据时的超时时间。如果在此时间内无法发送数据,则连接可能会被关闭。