请问tidb 最大sql语句长度有没有限制?

为提高效率,请提供以下信息,问题描述清晰能够更快得到解决:
【 TiDB 使用环境】v5.0.0

【概述】 场景 + 问题概述
请问tidb 最大sql语句长度有没有限制?例如select * from xxx where name in(…), 这条语句最大可以夺长?有没有系统变量设置?谢谢!
【应用框架及开发适配业务逻辑】

【背景】 做过哪些操作

【现象】 业务和数据库现象

【问题】 当前遇到的问题

【业务影响】

【TiDB 版本】

【附件】 相关日志及监控(https://metricstool.pingcap.com/)


若提问为性能优化、故障排查类问题,请下载脚本运行。终端输出的打印结果,请务必全选并复制粘贴上传。

4赞

看看是这个么

max-sql-length

max-sql-length

1赞

不是,这个变量控制 statement summary 显示的 SQL 字符串长度

1赞

我这边有遇到过in uuid的查询个数大概2000个,没有报错。

目前官方上好像没有这方面的描述,你可以手动写一下测试测试。

in 太多会导致不走索引哟,老铁。

2赞

以前试过in 3000多个会报错,改成3000没报了,想确认下

1赞

mysql中 ,in语句中参数个数是不限制的。不过对整段sql语句的长度有了限制
官方解释看这 https://dev.mysql.com/doc/refman/5.7/en/server-system-variables.html#sysvar_max_allowed_packet
报文大小限制默认4M。

在tidb的代码中也有类似的限制:

// Run reads client query and writes query result to client in for loop, if there is a panic during query handling,
// it will be recovered and log the panic error.
// This function returns and the connection is closed if there is an IO error or there is a panic.
func (cc *clientConn) Run(ctx context.Context) {
	const size = 4096

https://github.com/pingcap/tidb/blob/feee7c258ac7799499f561d281434b243c4fc92e/server/conn.go#L1022

6赞

:+1:源代码大佬~

1赞

大佬,学习了,oracle也有sql文本长度限制的。。不可能无限制。。。

1赞

大神,为啥我测试用了几十M的sql语句都没报错,版本的v5.3.0?

1赞

几十M的sql是咋写出来的:grinning:

1赞

有参数控制的吧

1赞

有限制。
但是即使没有限制,我们也应该写的短一点,简单一点。

1赞

一般是4096字节,再长了我觉得你就的改应用了。

1赞

in需要写那么多吗?这个真报错,单元测试就可以检查出来吧

2赞

我曾经测试过 16MB 的 SQL 语句也可以执行呢,更长的语句我没有测试过。

1赞

这个长度不能设置吗?

1赞

我见过更大的。
不管数据库有没有限制,从技术的角度来说我们自身都应该限制。

1赞

当然mysql oracle都有限制,tidb也有。

1赞
  • MySQL client 和 MySQL/TiDB Server 都有 max_allowed_packet 配额的限制,如果在使用过程中违反其中任何一个 max_allowed_packet 配额,客户端程序就会收到对应的报错。目前最新版本的 DM 和 TiDB Server 的默认 max_allowed_packet 配额都为 64M

官方文档有这个说明

https://docs.pingcap.com/zh/tidb/stable/dm-error-handling#原因-3