【问题标题】:Compare String function in mysql by words按单词比较mysql中的String函数
【发布时间】:2023-03-17 09:35:01
【问题描述】:

我正在尝试在 mysql 中创建搜索功能。为了使搜索结果更加可靠,我需要逐字比较两个字符串。输入是 2 个字符串,输出是两个字符串匹配的数字单词。在 MySql 中我做了如下。

CREATE DEFINER=`root`@`localhost` FUNCTION `CompareStrings`(str1 VARCHAR(255),str2 VARCHAR(255)) RETURNS double
BEGIN
DECLARE cur_position INT DEFAULT 1 ; 
DECLARE remainder TEXT;
DECLARE cur_string VARCHAR(50);
DECLARE delimiter_length TINYINT UNSIGNED;
DECLARE numberMatch INT;
DECLARE total INT;
DECLARE result DOUBLE DEFAULT 0;
DECLARE delim VARCHAR(10);
DECLARE string2 VARCHAR(255);
SET delim = ' ';

DROP TEMPORARY TABLE IF EXISTS SplitString1;
CREATE TEMPORARY TABLE SplitString1 (
    SplitString1ID INT NOT NULL PRIMARY KEY AUTO_INCREMENT ,
    val VARCHAR(50) NOT NULL
) ENGINE=MyISAM;
DROP TEMPORARY TABLE IF EXISTS SplitString2;
CREATE TEMPORARY TABLE SplitString2 (
    SplitString1ID INT NOT NULL PRIMARY KEY AUTO_INCREMENT ,
    val VARCHAR(50) NOT NULL
) ENGINE=MyISAM;

SET remainder = str1;
SET delimiter_length = CHAR_LENGTH(delim);

WHILE CHAR_LENGTH(remainder) > 0 AND cur_position > 0 DO
    SET cur_position = INSTR(remainder, delim);
    IF cur_position = 0 THEN
        SET cur_string = remainder;

    ELSE
        SET cur_string = LEFT(remainder, cur_position - 1);
    END IF;
    IF TRIM(cur_string) != '' THEN
        INSERT INTO SplitString1(val) VALUES (cur_string);
    END IF;
    SET remainder = SUBSTRING(remainder, cur_position + delimiter_length);
END WHILE;
SET remainder = str2;
SET cur_position = 1;
WHILE CHAR_LENGTH(remainder) > 0 AND cur_position > 0 DO
    SET cur_position = INSTR(remainder, delim);
    IF cur_position = 0 THEN
        SET cur_string = remainder;

    ELSE
        SET cur_string = LEFT(remainder, cur_position - 1);
    END IF;
    IF TRIM(cur_string) != '' THEN
        INSERT INTO SplitString2(val) VALUES (cur_string);
    END IF;
    SET remainder = SUBSTRING(remainder, cur_position + delimiter_length);
END WHILE;
SELECT count(*) INTO numberMatch 
FROM SplitString1 s1 JOIN SplitString2 s2 ON s1.val = s2.val;
RETURN result;
END

这个想法是创建两个临时表存储每个单词,然后比较这两个表。结果很好,但性能很糟糕。谁有更好的主意,请给我建议。 非常感谢!

【问题讨论】:

    标签: mysql search


    【解决方案1】:

    我认为这不会像所说的那样工作。

    逻辑是合理的,但您没有为 result 变量分配任何值。因此此函数将始终返回 0。替换:

    RETURN result;
    

    RETURN numberMatch;
    

    同时替换:

    CREATE DEFINER=`root`@`localhost` FUNCTION `CompareStrings`(str1 VARCHAR(255),str2 VARCHAR(255)) RETURNS double
    

    CREATE DEFINER=`root`@`localhost` FUNCTION `CompareStrings`(str1 VARCHAR(255),str2 VARCHAR(255)) RETURNS double READS SQL DATA
    

    就效率而言,它看起来相当高效。当您说“表现糟糕”时,什么是“糟糕”?你有任何基准数据吗? x 次调用耗时 y 毫秒?

    【讨论】:

    • 抱歉我的帖子有误,但事实上,正如你提到的,我返回了 numbermatch,我确信这个函数运行良好。问题是我花了大约 0.015 秒来比较基准测试中的两个字符串,并结合搜索功能花了我大约 5-6 秒,而数据库中只有 5k 条记录。无论如何,谢谢你的评论。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多