Mysql 8.0 第5章 Mysql服务器管理 (第5.1.8节 服务器系统变量 )

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并带有警告)。

这里有一个 例子,可以看下。

猜你喜欢

转载自blog.csdn.net/lengfengyuyu/article/details/84892612