对于我正在从事的项目,我必须扫描 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 EXISTS
。 IF 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/