使用FInd_IN_SET vs IN子句MYSQL存储过程

时间:2013-07-14 17:12:18

标签: mysql stored-procedures sql-optimization sqlperformance

我有一个类似于下面的存储过程

SELECT * 
FROM Table1
WHERE Tag IN (ids)

此处TagInteger列。

我厌倦了将逗号分隔值作为字符串传递给存储过程,但它不起作用。然后我使用了如下的存储过程

SELECT * 
FROM Table1
WHERE FIND_IN_SET(Tag, ids) 

这非常有效,唯一的问题是我的表非常大 - 在运行直接SQL语句时,与IN相比,数百万行和使用FIND_IN_SET需要太长时间。

最佳性能优化选项是什么?

是否有一个split函数可以将id转换为整数并为IN子句解析它?我认为这将是最好的选择。有什么建议或想法吗?

1 个答案:

答案 0 :(得分:3)

您可以准备一个声明然后执行它:

set @sql = concat('select * from table1 where tag in (', ids, ')');

PREPARE q FROM @sql;

execute q;

这为每次执行构造了字符串,因此您可以使用in。生成的执行应该能够使用tag上的索引,这应该会大大加快速度。