优化此MySQL查询以不使用函数

时间:2015-10-11 20:38:07

标签: mysql sql database-performance

/*Usage example: This function takes S. O. L. I. D. as input and returns SOLID. And similarly removes single quotes, hyphens and slashes from input*/
CREATE DEFINER=`root`@`localhost` FUNCTION `SanitiseNameForSearch`(Name nvarchar(100)) RETURNS varchar(100) CHARSET utf8
BEGIN
    RETURN REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(Name, ' ', ''), '.', ''), '''', ''), '-', ''), '/', '');
END

在程序中使用此功能,将功能应用于搜索输入和列。工作正常,但绝对不可扩展。

CREATE DEFINER=`root`@`localhost` PROCEDURE `Search`(SearchFilter nvarchar(20))
BEGIN
    SET @SearchFilter = `SanitiseNameForSearch`(SearchFilter);

    SELECT t.TermId, t.Name
    FROM Terminology AS t
    WHERE `SanitiseNameForSearch`(Name) Like @SearchFilter
    ORDER BY length(Name) asc
    LIMIT 5;
END;

通过函数实现此功能是理想的,还是在应用函数后添加一个单独的列/表来保存列值,即保持预先计算的SanitiseNameForSearch(Name)值,以便对其进行索引?

1 个答案:

答案 0 :(得分:0)

LIKE '%...'根本没有优化。它会进行表扫描。因此,这个是“不可扩展”的主要部分。相比之下,这些功能是微不足道的。

那么,该怎么办?查看FULLTEXT以查看是否可以使用它。它可能需要改变用户的期望 - 它寻找整个单词,而不是任意的子串。但它很多更快且可扩展。

使用FULLTEXT可以避免使用Sanitize功能。

(那么,伙计们,关于贬低和关闭这个问题的所有废话是什么?我没有回答他的问题,或者至少是暗示的问题吗?)