2013-07-14 91 views
2

我有一個存儲過程類似於以下使用FIND_IN_SET的VS IN子句MySQL存儲過程

SELECT * 
FROM Table1 
WHERE Tag IN (ids) 

這裏TagInteger列。

我厭倦了逗號分隔值作爲字符串傳入存儲過程,但它不起作用。像下面

SELECT * 
FROM Table1 
WHERE FIND_IN_SET(Tag, ids) 

這工作得很好然後我用存儲過程,唯一的問題是我的表是非常大的 - 數百萬行,並使用FIND_IN_SET太長時間運行比較直接的SQL語句時需要爲IN。

什麼是最佳性能優化選項?

是否有一個拆分函數可以將ID轉換爲整數並解析它準備好IN子句?我認爲這將是最好的選擇。任何建議或想法?

+0

http://stackoverflow.com/questions/6152137/mysql-string-split –

回答

3

您可以準備語句,然後執行它:

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

PREPARE q FROM @sql; 

execute q; 

這構建了每個執行字符串,所以你可以使用in。由此產生的執行應該能夠使用tag上的索引,這應該可以大大加快速度。

+0

,實際上在一個測試 FIND_IN_SET工作 :3.978sec 94rows返回 IN:1.732sec 94rows返回 CONCAT(yourexample):1.747秒94行 –

+0

這很酷 –