[英]Find the size of a query
基于 MySQL 中的max_allowed_packet
cket 配置参数,我很想知道如何确定与该特定配置相关的查询的大小?
我们可以在 MySQL 服务器中使用SHOW VARIABLES LIKE 'max_allowed_packet'
命令。 这将为参数提供当前值,然后可用于相应地计算查询的大小。 此外,还可以使用SET GLOBAL max_allowed_packet
命令为参数设置新值。
我的问题是:如何计算出与此配置相比的查询的大小?
数据包的 MariaDB协议文档指出,客户端发送的每个数据包都必须低于max_allowed_packet限制。 这意味着所有 SQL 查询必须短于max_allowed_packet
cket 。 在大多数情况下,这不是您必须担心的事情,除非您使用 SQL 语句插入大批量数据。
由于 .network 数据包中有一些开销,对于小于 16Mib 的查询,一个好的经验法则是将查询的字符串长度(以字节为单位)减去 1 个字节:数据包 header的长度将是 SQL 查询加上COM_QUERY字节。 一般来说,为了达到极限而走这么远是不值得的,保持远低于极限往往是一种更实用的方法。
这并不意味着服务器不会生成比这更长的数据包。 这是服务器超过max_allowed_packet
限制的示例:
MariaDB [test]> SET @a = (SELECT GROUP_CONCAT(seq) FROM seq_0_to_1000000);
Query OK, 0 rows affected, 1 warning (0.060 sec)
MariaDB [test]> SELECT LENGTH(@a), @@max_allowed_packet, @@group_concat_max_len;
+------------+----------------------+------------------------+
| LENGTH(@a) | @@max_allowed_packet | @@group_concat_max_len |
+------------+----------------------+------------------------+
| 1048576 | 16384 | 1048576 |
+------------+----------------------+------------------------+
1 row in set (0.001 sec)
MariaDB [test]> SELECT LENGTH(@a), @a\G
*************************** 1. row ***************************
LENGTH(@a): 1048576
@a: 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15
... More data ...
max_allowed_packet
的值也与结果集的大小无关。 您可以生成 1 TB 大小的结果,并将max_allowed_packet
cket 设置为 16Kib。 发生这种情况是因为结果集是 stream 个数据包,如果每个单独的数据包都低于限制,则结果的长度没有限制。
正如 Georg Richter 在评论中提到的那样, @max_allowed_packet
也会影响某些文字/字符串的长度。 例如, SET @a:= REPEAT("A", @@max_allowed_packet + 1)
将失败,即使实际 SQL 语句的字符串长度只有几个字节。
要在数据库中 100% 执行此操作,您可以根据查询结果创建一个表:
CREATE TABLE db_name.test_table SELECT a v1, b v2 FROM db_name.tbl2;
您想要的结果大小的查询应该替换
SELECT a v1, b v2 FROM db_name.tbl2
然后获取表格的大小
SELECT round((data_length / 1024 / 1024), 2) "Size in MB"
FROM information_schema.TABLES
WHERE table_schema = "db_name" AND table_name = "test_table";
然后删除测试表:
drop table db_name.test_table;
这只会为您提供原始数据大小,但不会提供任何额外的开销,例如传回的数据包标头(如果您的结果集被分成许多数据包)。
甚至可能有一种聪明的方法可以使用临时表或在将查询传递给它的存储过程中执行此操作。
之后,您可以在 select 中获取您的 GLOBAL VARIABLES 进行比较
SELECT
variable_name,
variable_value
FROM information_schema.global_variables
WHERE variable_name LIKE 'max_allowed_packet';
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.