对于我正在进行的项目,我必须扫描一个键以获得最佳匹配。只有这些扫描会对我们的测试系统造成很大的负担。任何人都知道如何改进这个?我们已经尝试过临时表和游标。
我们正在使用的代码示例:
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;
答案 0 :(得分:1)
不要使用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;
答案 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;