参考:
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})
进行查询。