对于我正在研究的项目,我必须扫描一个键以找到最佳匹配。仅这些扫描会给我们的测试系统造成很多负担。有谁知道我可以如何改善这一点?我们已经尝试过临时表和游标。

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

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;

最佳答案

不用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;

10-07 15:38