in中到底能放多少个数据?200?1000?10000?

994 阅读1分钟

对于以下in语句:

select * from user_info where id in (1,2);

in条件中放了两个数据,那么最多能放多少个数据呢?

为此,我做了一个测试,以下是基于MyBatis-Plus写的测试代码:

int size = 1000;

List<Integer> list = IntStream.range(0, size)
        .boxed()
        .collect(Collectors.toList());


// 注意使用的是in条件
List<UserInfo> result = ChainWrappers.queryChain(userMapper)
        .in("id", list)
        .list();

我的公众号:「IT周瑜」里面:面试八股文、BAT面试真题、工作内推、工作经验分享、技术专栏等等什么都有,欢迎关注。

测试了size=1000、size=10000、size=100000都不会报错,直到测试size=1000000,也就是in中有100百万个数据,才会报错,报错信息如下:

com.mysql.cj.jdbc.exceptions.PacketTooBigException: Packet for query is too large (6,888,944 > 4,194,304). 
You can change this value on the server by setting the 'max_allowed_packet' variable.

从错误信息可以看出,报错原因并不是in的数据太多了(已经有一百万个了),而是sql语句太长了,超过了4,194,304个字节,也就是4M,在我的MySQL中max_allowed_packet变量的值为

但是根据MySQL官网中的描述,max_allowed_packet默认值为67108864,也就是64M。

因此,从测试可以看出,MySQL的in中并没有数量上的限制,但是有sql语句整体大小的限制,不过还是建议in条件中不要超过200个数据,原因跟查询优化器计算成本有关,本文就暂时不分析了,感兴趣的同学可以关注我的公众号:IT周瑜