【问题标题】:Use of FInd_IN_SET vs IN clause MYSQL stored procedure使用 FInd_IN_SET vs IN 子句 MYSQL 存储过程
【发布时间】:2013-07-12 13:48:50
【问题描述】:

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

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 子句解析它?我认为那将是最好的选择。有什么建议或想法吗?

【问题讨论】:

标签: mysql stored-procedures sql-optimization sqlperformance


【解决方案1】:

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

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

PREPARE q FROM @sql;

execute q;

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

【讨论】:

  • 实际在一个测试中工作 Find_in_Set :3.978sec 94rows return IN :1.732sec 94rows return concat(yourexample): 1.747 sec 94 rows
猜你喜欢
  • 2018-08-10
  • 2012-12-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-08
  • 1970-01-01
  • 1970-01-01
  • 2013-07-29
相关资源
最近更新 更多