在昨天系统上线之后发现后台有一个接口一直是超时状态,翻来覆去看了很多的地方同时也想了很多原因最后在定位在一条更新语句出现了性能问题导致的接口超时.
这种sql就是标题说的mysql中update里边使用in并且在in中使用子查询时出现的,具体原因网上有很多的解释,这里就大概说一下
sql的形状是 UPDATE 表X SET A = 1, B = 2 WHERE C IN (SELECT C FROM 表Y WHERE D = 3) AND E = 5
大家可以看到上边的语句单独哪一部分都不会出现问题,把update转换成select语句也不会出现问题,唯独上边这样写加上表中数据量有一些就有可能出现性能问题.
这块不再啰嗦,具体的解决办法可以将in中的查询单独拉出来在后端先执行然后以参数形式传入即可避免,
另外一种方法可以尝试改成如下形状只需要套一层 UPDATE 表X SET A = 1, B = 2 WHERE C IN (
SELECT * FROM (SELECT C FROM 表Y WHERE D = 3) ALLINFO) AND E = 5
标蓝处再添加一层可将里边的查询提前执行,避免N*N次这样的慢查询.