MySQL:有没有改进最佳匹配存储过程的建议
对于一个项目,我的工作,我必须扫描一个最佳匹配的关键。只有这些扫描在我们的测试系统上造成了很大的负载。有人知道我该如何改进吗?我们已经尝试了临时表和游标 我们正在使用的代码示例如下:MySQL:有没有改进最佳匹配存储过程的建议,mysql,sql,stored-procedures,range,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
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可以在找到匹配项后立即停止扫描,而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;
像这样的怎么样 对于没有找到数据的每次迭代,它跳入异常块,跳过离开,直到找到记录 这将节省您为每个迭代进行2次选择 注意,我添加了一个限制1,以阻止select返回多行的可能性
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;
这段代码到底想做什么?这是整个过程还是只是一部分?TSQL中有,但MySQL可能不同。尝试设置resultCount=选择存在的1。。。MySQL中当然有一个EXISTS构造,但我不知道它是否可以像我现在这样用在if语句中。不过,您可以轻松地对其进行返工,以避免计数*。如果任何一个手头有MySQL服务器的人,我只有在我的家用机器上才能确认,那么我可以在必要时修改我的答案。