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

标签 mysql sql stored-procedures range

对于我正在从事的项目,我必须扫描 key 以获得最佳匹配。只有这些扫描才会对我们的测试系统造成大量负载。有人知道我该如何改进吗?我们已经尝试过临时表和游标。

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

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;

关于MySQL:任何改进最佳匹配存储过程的建议,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6629130/

相关文章:

mysql - 从 MySQL 中的时间戳获取最近 'X' 天的记录

sql - 使用 GROUP BY 查询获取行数

sql - 填充表 SQL 中缺失的行

c# - 如何通过参数化存储过程填充列表框?

java - character_result_set 在 mysql 中为空

sql - 查询返回不同的结果

c++ - 带有 "partition by"的准备好的语句对 Sybase IQ 不起作用?

NHibernate GetNamedQuery 执行存储过程但返回空列表

sql-server - MSSQL Nodejs 模块在执行存储过程时抛出无效时间

java - 自动在后台执行MySQL语句