MySQL:任何改进最佳匹配存储过程的建议

时间:2011-07-08 18:57:33

标签: mysql sql stored-procedures range

对于我正在进行的项目,我必须扫描一个键以获得最佳匹配。只有这些扫描会对我们的测试系统造成很大的负担。任何人都知道如何改进这个?我们已经尝试过临时表和游标。

我们正在使用的代码示例:

SET keyLength = (LENGTH(key)-1);
WHILE keyLength >=1 DO
    SELECT COUNT(*) INTO resultCount FROM keytable
    WHERE I ScreeningKey = (SELECT SUBSTRING(key)-,1,keyLength));
    IF (0 < resultCount) THEN
        SELECT ScreeningKey INTO bestMatchScreeningKey FROM keytable 
        WHERE AND ScreeningKey = (SELECT SUBSTRING(key)-,1,keyLength));

        /*go to step4*/
        LEAVE Step4;
    END IF;
    SET keyLength = keyLength-1;
END WHILE;

2 个答案:

答案 0 :(得分:1)

不要使用SELECT COUNT(*),而只使用IF EXISTSIF EXISTS可以在找到匹配后立即停止扫描,而COUNT(*)需要通过整个表来计算该计数。

所以,你最终会得到类似的东西:(我没有使用太多MySQL,所以我不确定语法,我复制粘贴你的语法对我来说不太合适...... )

SET keyLength = (LENGTH(key)-1);
WHILE keyLength >=1 DO
    IF EXISTS (SELECT * FROM keytable
               WHERE I ScreeningKey = (SELECT SUBSTRING(key)-,1,keyLength))) THEN
        SELECT SUBSTRING(key)-,1,keyLength INTO bestMatchScreeningKey;

        /*go to step4*/
        LEAVE Step4;
    END IF;
    SET keyLength = keyLength-1;
END WHILE;

答案 1 :(得分:0)

这样的事情怎么样?

对于没有找到数据的每次迭代,它会跳转到异常块(跳过LEAVE)直到找到记录。

这将节省您为每次迭代做2次选择。

注意我添加了LIMIT 1以停止选择返回多行的可能性。

SET keyLength = (LENGTH(key)-1);
WHILE keyLength >=1 DO
BEGIN
    SELECT SUBSTRING(key)-,1,keyLength INTO bestMatchScreeningKey LIMIT 1;
    LEAVE Step4;
EXCEPTION
    WHEN no_data_found THEN
        NULL;
    WHEN others THEN
        RAISE;
END;
    SET keyLength = keyLength-1;
END WHILE;