2015-05-29 25 views
2

我有我在哪里传递为用逗号分隔MEDIUMTEXT场替代计划FIND_IN_SET可以使用索引

对于检查号码清单,如果我的参数匹配在我的存储过程,我使用FIND_IN_SET作为我的SQL存储过程如下

SELECT SQL_CALC_FOUND_ROWS f1,f2,f3,f4 FROM `mytable` 
WHERE FIND_IN_SET(f2,'1,2,4,5,6,6,7,8,8,4,9,7.......................') > 0 
ORDER BY f1 DESC   
LIMIT 25 OFFSET 0 
; 

SELECT FOUND_ROWS(); 

现在的问题FIND_IN_SET后来我发现是,由于这我查询花费太长时间才能完成它不使用索引。 请在查询中建议任何改进

P.S.

以下是我的完整的存储过程(包括如下答案建议中的更改)

DECLARE _calculated_offset INT; 
    SET _calculated_offset = _limit * (_pageNumber -1); 
    IF _calculated_offset < 0 THEN 
     SET _calculated_offset = 0; 
    END IF;   

    /*SELECT SQL_CALC_FOUND_ROWS f1,f2,f3,f4 FROM `mytable` 
    WHERE FIND_IN_SET(f1,_telcoIdList) > 0 
    AND FIND_IN_SET(f2,_msisdnList) > 0 
    ORDER BY f3 DESC   
    LIMIT _limit OFFSET _calculated_offset 
    ; 

    SELECT FOUND_ROWS();*/ 


SET @query = CONCAT('SELECT SQL_CALC_FOUND_ROWS f1,f2,f3,f4 
    FROM `mytable` 
    WHERE f1 in (',_telcoIdList,') 
    AND f2 in (',_msisdnList,') 
    ORDER BY f3 DESC   
    LIMIT ', _limit,' OFFSET ',_calculated_offset,' ; 

    SELECT FOUND_ROWS(); 

    '); 
    PREPARE stmt FROM @query; 
    EXECUTE stmt; 
    DEALLOCATE PREPARE stmt; 
+0

你为什么用'SQL_CALC_FOUND_ROWS'订购..还是有缺失的逗号? ? – Arth

+0

@Arth请阅读https://dev.mysql.com/doc/refman/5.0/en/information-functions.html#function_found-rows – Akhil

+0

@Akhil,我知道它是什么..只是想知道为什么你会'订购BY' it ..它目前别名为'f1' – Arth

回答

1

用事先准备好的声明,并切换到in条款

SET @query = CONCAT('SELECT SQL_CALC_FOUND_ROWS f1,f2,f3,f4 FROM mytable 
WHERE f2 in (', myinputstr, ') ORDER BY f1 DESC LIMIT 25 OFFSET 0'); 

    PREPARE stmt FROM @query; 

    EXECUTE stmt; 

    DEALLOCATE PREPARE stmt; 

这将使F2指数是用过的。

编辑:包括foundrows语句,使用下面的风格

SET @query = CONCAT('SELECT SQL_CALC_FOUND_ROWS f1,f2,f3,f4 
    FROM `mytable` 
    WHERE f1 in (',_telcoIdList,') 
    AND f2 in (',_msisdnList,') 
    ORDER BY f3 DESC   
    LIMIT ', _limit,' OFFSET ',_calculated_offset); 
    PREPARE stmt FROM @query; 
    EXECUTE stmt; 
    DEALLOCATE PREPARE stmt; 

    SELECT FOUND_ROWS(); 

BTW,加入SQL_CALC_FOUND_ROWS也查询

+1

这将不会'强制'索引被使用..允许但不强制。另外'IN'的语法与'FIND_IN_SET'不同。 – Arth

+0

'IN'要求每个选项都是一个单独的值 – Arth

+0

@Arth。我同意你关于指数的第一点。 “force”的使用不当 – Akhil