参考:

https://www.zhihu.com/question/578354887/answer/2846786420

数据量较小的情况

采用in (a,b,c,d,...)的方式。

数据量较大的情况

采用临时表,把IN的变量放进一个临时表中,然后改写为子查询方式

这种方法稍微麻烦一些。有可能临时表数据不可见,调试不方便。但是该方式优点很明显。

首先是不会因为参数很多导致SQL很长,提升了SQL的易读性;

其次是无论多少参数,SQL语句完全一样,而对数据库来说,同一个SQL,就可以复用很多东西,比如执行计划。这样有利于提升SQL的性能。

一个简单的临时表:

DROP TABLE IF EXISTS `temp_table`;
CREATE TABLE `temp_table`  (
  `id` int(11) NOT NULL AUTO_INCREMENT,
   `proc_id` int(11) NOT NULL,
  `int_value` int(11) NULL DEFAULT NULL,
  `string_value` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,
  PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 7 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic;

SET FOREIGN_KEY_CHECKS = 1;

预设了int和string两种类型,这样可以通过

select xxx from table where id in (select int_value from temp_table where proc_id = #{prod_id})

进行查询。