Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/62.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MySQL:有没有改进最佳匹配存储过程的建议_Mysql_Sql_Stored Procedures_Range - Fatal编程技术网

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服务器的人,我只有在我的家用机器上才能确认,那么我可以在必要时修改我的答案。