2

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

SELECT * 
FROM Table1
WHERE Tag IN (ids)

Tag是一个Integer专栏。

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

SELECT * 
FROM Table1
WHERE FIND_IN_SET(Tag, ids) 

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

最好的性能优化选项是什么?

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

4

1 回答 1

4

您可以准备一个语句,然后执行它:

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

PREPARE q FROM @sql;

execute q;

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

于 2013-07-14T17:18:52.540 回答