Mycat 聚合函数bug
5,066 total views, 2 views today
开发同事反应给我,通过Mycat 查询小值,遇到了一个bug。子查询中应该得到结果为5个10,整个查询结果应为10。但是这里为0,显然是错误的。
1 2 3 4 5 6 7 |
mysql> select min(task_ymd) from (SELECT 10 AS task_ymd FROM table_name LIMIT 5 ) t ; +------+ | MIN0 | +------+ | 0 | +------+ 1 row in set (0.00 sec) |
我测试了几遍,确实存在这个问题。向下直接捅到MySQL,在不同分片上执行相同的语句。
结果有两种。
1、子查询所在的分片中表中没有数据,那么返回值为NULL
1 2 3 4 5 6 7 |
mysql> select min(task_ymd) from (SELECT 10 AS task_ymd FROM sharding_001.table_name LIMIT 5 ) t ; +---------------+ | min(task_ymd) | +---------------+ | NULL | +---------------+ 1 row in set (0.02 sec) |
或者条件过滤后,满足条件的行数为0,也是同样的结果。
1 2 3 4 5 6 7 |
mysql> select min(task_ymd) from (SELECT 10 AS task_ymd FROM sharding_001.table_name where task_ymd<>0 LIMIT 5 ) t ; +---------------+ | min(task_ymd) | +---------------+ | NULL | +---------------+ 1 row in set (0.02 sec) |
2、子查询中过滤后有数据返回,那么结果是正常的10
1 2 3 4 5 6 7 8 |
mysql> select min(task_ymd) from (SELECT 10 AS task_ymd FROM sharding_002.table_name where task_ymd<>0 LIMIT 5 ) t ; +---------------+ | min(task_ymd) | +---------------+ | 10 | +---------------+ 1 row in set (0.00 sec) |
到了这里,推测是返回NULL值的分片导致了Mycat最终返回错误结果的原因。
将返回为NULL的分片表中插入伪数据,使子查询返回条数不为0。再次在Mycat执行SQL,返回结果正确。看来还真是分片返回NULL导致了这个问题。
解决办法:
将mycat server.xml中的参数修改为0,这个问题解决
1 |
<property name="useOffHeapForMerge">0</property> |
该参数开启,Mycat在堆外内存进行聚合函数,会发生上面的问题。
该参数关闭,Mycat则是在堆内内存进行聚合函数。
开发同事研究Mycat代码之后,表示堆外的那套代码有问题,所以产生了上面的错误。
上午11:43
赞