MySQL“;用于查询的数据包太大”;查询长度与“允许的最大数据包”完全匹配`

MySQL“;用于查询的数据包太大”;查询长度与“允许的最大数据包”完全匹配`,mysql,Mysql,我正在编写一个工具,将表从源导入到dest,并生成用于导入的查询。目前,我的工具知道destmax_allowed_packet设置为什么,并且只写入具有足够行的insert查询,以免超过此限制 问题是,我碰巧遇到了一个查询,它正好是1048576(1MB),或者我设置的最大数据包大小。我当然会假设一个数据包包含的不仅仅是查询,所以这对我来说是有意义的,但是如果给定一个最大数据包大小,我如何找出一个没有参数的查询的实际最大长度应该是多少呢 我已经看过这篇文章,上面说用数据包大小除以11得到我的查

我正在编写一个工具,将表从源导入到dest,并生成用于导入的查询。目前,我的工具知道dest
max_allowed_packet
设置为什么,并且只写入具有足够行的insert查询,以免超过此限制

问题是,我碰巧遇到了一个查询,它正好是
1048576(1MB),或者我设置的最大数据包大小。我当然会假设一个数据包包含的不仅仅是查询,所以这对我来说是有意义的,但是如果给定一个最大数据包大小,我如何找出一个没有参数的查询的实际最大长度应该是多少呢


我已经看过这篇文章,上面说用数据包大小除以11得到我的查询长度(实际上是说最大参数len*11应该是最大数据包大小),但这听起来很傻。

这很难回答,因为没有固定的长度,这只是影响TCP数据包大小的一些因素

所以要理解它,在MySQL服务器之前有TCP层

因此,我们可以看到,由于允许的选项,TCP头数据的大小可能会有所不同,但对TCP来说至关重要的是,首先有140位,然后我们的MySQL数据在TCP选项块之后开始,所以这是在MySQL服务器处理任何信息之前

MySQL服务器必须有关于编码的信息,它的选项,比如这个查询是否参数化,然后是查询。字符串中的一个字符可以是常见的字符之一(2位ASCII、8位UTF-8、16位UTF-16,可能我不确定MySQL服务器是否支持)32位UTF-32(注意,这是字符串发送到DB服务器的格式,而不是DB服务器保存的格式)

这就是为什么它是可变长度的,因此,没有定义查询大小,例如,您编写的查询的大小很可能会保存到查询头数据中,以便MySQL服务器知道在哪里停止读取。这将推动数据开始位置的数据偏移。(例如,查询越大,MySQL的头越大)


另一个需要注意的因素是,数据包越大,校验和计算所需的时间就越长,如果校验和验证失败,则必须重新传输整个数据包,因此,对于大多数服务器软件来说,获得正确的数据包是一件痛苦的事——如果一切正常,速度之间的平衡,如果数据包失败,必须重新传输,那么这是很难回答的,因为没有固定的长度,这只是影响TCP数据包大小的一些因素

所以要理解它,在MySQL服务器之前有TCP层

因此,我们可以看到,由于允许的选项,TCP头数据的大小可能会有所不同,但对TCP来说至关重要的是,首先有140位,然后我们的MySQL数据在TCP选项块之后开始,所以这是在MySQL服务器处理任何信息之前

MySQL服务器必须有关于编码的信息,它的选项,比如这个查询是否参数化,然后是查询。字符串中的一个字符可以是常见的字符之一(2位ASCII、8位UTF-8、16位UTF-16,可能我不确定MySQL服务器是否支持)32位UTF-32(注意,这是字符串发送到DB服务器的格式,而不是DB服务器保存的格式)

这就是为什么它是可变长度的,因此,没有定义查询大小,例如,您编写的查询的大小很可能会保存到查询头数据中,以便MySQL服务器知道在哪里停止读取。这将推动数据开始位置的数据偏移。(例如,查询越大,MySQL的头越大)


另一个需要注意的因素是,数据包越大,校验和计算所需的时间就越长,如果校验和验证失败,则必须重新传输整个数据包,因此,对于大多数服务器软件来说,获得正确的数据包是一件痛苦的事——如果一切正常,速度之间的平衡,如果数据包失败,则必须重新传输。

我认为它应该是数据包大小/8,但它不是固定的,因为它完全取决于实际查询之前使用的查询元数据,例如是否运行参数绑定。话虽如此,我倾向于留下10%到20%的头顶安全网,但别忘了每个字符的长度可能是2、4、8或16位,具体取决于encoding@Barkermn01没错,我有90%的价格,现在可以用了,但这似乎浪费了很多空间,特别是如果您将数据包大小设置为1GB之类的大数据包,则TCP最大数据包大小为65535字节(63.990 KB),即使如此,您也不希望数据包太大,因为数据包越大,如果数据包失败,需要重新传输的数据就越多,而且数据包越大,TCP验证的时间就越长,这听起来很公平,我将坚持使用百分比缓冲区@Barkermn01,我相信它应该是数据包大小/8,但它不是固定的,因为它完全取决于实际查询之前使用的查询元数据,例如是否运行参数绑定。话虽如此,我倾向于留下10%到20%的头顶安全网,但别忘了每个字符的长度可能是2、4、8或16位,具体取决于encoding@Barkermn01没错,我有90%的价格,现在可以用了,但这似乎浪费了很多空间,特别是如果您将数据包大小设置为1GB之类的大数据包,则TCP最大数据包大小为65535字节(63.990 KB),即使如此,您也不希望数据包太大,因为数据包越大,如果数据包失败,需要重新传输的数据就越多,而且数据包越大,TCP验证的时间就越长,这听起来很公平,我会坚持我的百分比缓冲,然后@Barkermn01