我有一个类似于下面的存储过程
SELECT *
FROM Table1
WHERE Tag IN (ids)
此处Tag
是Integer
列。
我厌倦了将逗号分隔值作为字符串传递给存储过程,但它不起作用。然后我使用了如下的存储过程
SELECT *
FROM Table1
WHERE FIND_IN_SET(Tag, ids)
这非常有效,唯一的问题是我的表非常大 - 在运行直接SQL语句时,与IN相比,数百万行和使用FIND_IN_SET需要太长时间。
最佳性能优化选项是什么?
是否有一个split函数可以将id转换为整数并为IN子句解析它?我认为这将是最好的选择。有什么建议或想法吗?
答案 0 :(得分:3)
您可以准备一个声明然后执行它:
set @sql = concat('select * from table1 where tag in (', ids, ')');
PREPARE q FROM @sql;
execute q;
这为每次执行构造了字符串,因此您可以使用in
。生成的执行应该能够使用tag
上的索引,这应该会大大加快速度。