Mysql服务器系统变量变量列表
不断翻译,不断更新…
max_allowed_packet
属性 | 值 |
---|---|
命令行使用格式 | --max-allowed-packet=# |
系统变量 | max_allowed_packet |
范围 | global,session |
Dynamic | 是 |
SET_VAR 提示 | 否 |
类型 | 整数 |
默认值(> = 8.0.3) | 67108864 (64MB) |
默认值(<= 8.0.2) | 4194304 (4MB) |
最小值 | 1024 |
最大值 | 1073741824 (1GB) |
一个数据包或任何生成/中间字符串的最大大小,或C API函数 mysql_stmt_send_long_data()发送的任何参数 的大小。默认值为64MB。
数据包消息缓冲区初始化为 net_buffer_length字节,但在需要时可以增长到max_allowed_packet
字节。默认情况下,此值很小,以捕获大量(可能不正确)的数据包。
如果使用大BLOB列或长字符串,则必须增加此值 。它应该与您想要使用BLOB的最大值一样大 。协议限制为 max_allowed_packet=1GB
。该值应为1024的倍数; 非1024的倍数值会向下舍入到最接近的倍数。
通过更改max_allowed_packet 变量的值来更改消息缓冲区大小时,如果客户端程序允许,还应更改客户端的缓冲区大小。max_allowed_packet内置于客户端库的默认 值为1GB,但单个客户端程序可能会覆盖此值。例如, mysql和mysqldump的默认值分别为16MB和24MB。它们还允许您通过在命令行或选项文件中进行设置max_allowed_packet来更改客户端值 。
此变量的会话值是只读的。客户端最多可以接收与会话值一样多的字节。但是,服务器不会向客户端发送比当前全局max_allowed_packet值更多的字节 。(如果在客户端连接后更改全局值,则全局值可能小于会话值。)
译者实例:
通常在批量添加记录的时候就会出现此问题:
(1)批量操作语句:
sql = 'insert into t5 values'
for i in range(100000):
sql += '(NULL,"' + ''.join(random.sample(string.ascii_lowercase, 5)) + '","' + ''.join(
random.sample(string.ascii_lowercase, 5)) + '","' + ''.join(
random.sample(string.ascii_lowercase, 7)) + '","' + ''.join(random.sample(string.ascii_lowercase, 8)) + '"),'
sql = sql[:len(sql) - 1] + ";"
这里向t5表插入20W条记录,打印sql语句的长度是8800021,已经超4M,报错如下:
File "C:\Python37\lib\site-packages\pymysql\err.py", line 109, in raise_mysql_exception
raise errorclass(errno, errval)
pymysql.err.InternalError: (1153, "Got a packet bigger than 'max_allowed_packet' bytes")
(2)修改max_allowed_packet为64M,重新进命令行,并重新提交批量数据,不再报错。
set global max_allowed_packet=1024 * 1024 * 64;
max_sort_length
属性 | 值 |
---|---|
命令行使用格式 | --max-sort-length=# |
系统变量 | max_sort_length |
范围 | global,session |
Dynamic | 是 |
SET_VAR 提示 | 是 |
类型 | 整数 |
默认值 | 1024 |
最小值 | 4 |
最大值 | 8388608 |
排序数据值时使用的字节数。
服务器仅使用每个列值的前max_sort_length
个字节,而忽略其余的值。因此,在GROUP BY, ORDER BY, DISTINCT
的排序中使用前max_sort_length
个字节。
增加max_sort_length
也可能需要增加sort_buffer_size
的值 。有关详细信息,请参见 第 8.2.1.14节“ORDER BY优化”。
译者实例:
(1)实例表
create table sv_max_sort_length(id int auto_increment primary key,c1 varchar(10) not null);
insert into sv_max_sort_length values (NULL,'abcdefffff'),
(NULL,'bbcdefffff'),(NULL,'bbcdeaaaaa'),values(NULL,'bbcdeaaa0a');
mysql> select * from sv_max_sort_length order by c1;
+----+------------+
| id | c1 |
+----+------------+
| 1 | abcdefffff |
| 4 | bbcdeaaa0a |
| 3 | bbcdeaaaaa |
| 2 | bbcdefffff |
+----+------------+
(2)设置全局变量 max_sort_length = 5
,退出命令行并重进。
set global max_sort_length = 5;
(3)再次查看结果,已经发生了变化。
mysql> select * from sv_max_sort_length order by c1;
+----+------------+
| id | c1 |
+----+------------+
| 1 | abcdefffff |
| 2 | bbcdefffff |
| 3 | bbcdeaaaaa |
| 4 | bbcdeaaa0a |
+----+------------+
4 rows in set (0.00 sec)
sort_buffer_size
属性 | 值 |
---|---|
命令行使用格式 | --sort-buffer-size=# |
系统变量 | sort_buffer_size |
范围 | global,session |
Dynamic | 是 |
SET_VAR 提示 | 是 |
类型 | 整数 |
默认值 | 262144 (也就是256KB) |
最小值 | 32768 |
最大值(非Windows,64位平台) | 18446744073709551615 |
最大值(非Windows,32位平台) | 4294967295 |
最大价值(Windows) | 4294967295 |
每个执行排序的会话都必须分配一个拥有此大小的缓冲区。
sort_buffer_size 不特定于任何存储引擎,并且以一般方式应用于优化。sort_buffer_size的最小值必须足够大,以容纳排序缓冲区中的十五个元组。此外,增加max_sort_length
可能需要增加sort_buffer_size
。有关更多信息,请参见 第8.2.1.14节“ORDER BY优化”
如果在SHOW GLOBAL STATUS
输出中看到每秒很多Sort_merge_passes
,则可以考虑增加 sort_buffer_size值以加速ORDER BY或GROUP BY,这种方法可能在你通过 查询优化或改进索引 依然无法提升查询效率的时候起到作用。
优化器尝试计算出需要多少空间,但可以分配更多空间,直到极限。将其设置为大于全局所需的大小将减慢大多数排序的查询。最好将其作为会话设置进行增加,并且仅适用于需要更大尺寸的会话。在Linux上,存在256KB和2MB的阈值,其中较大的值可能显着减慢内存分配,因此您应该考虑保持低于其中一个值。尝试为您的需求找到最佳价值。请参见 第B.6.3.5节“MySQL存储临时文件的位置”。
允许的sort_buffer_size最大值为 4GB-1
。64位平台允许更大的值(64位Windows除外,其中大值被截断为4GB-1
并带有警告)。
这里有一个 例子,可以看下。