/*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)
值,以便对其进行索引?
答案 0 :(得分:0)
LIKE '%...'
根本没有优化。它会进行表扫描。因此,这个是“不可扩展”的主要部分。相比之下,这些功能是微不足道的。
那么,该怎么办?查看FULLTEXT
以查看是否可以使用它。它可能需要改变用户的期望 - 它寻找整个单词,而不是任意的子串。但它很多更快且可扩展。
使用FULLTEXT可以避免使用Sanitize功能。
(那么,伙计们,关于贬低和关闭这个问题的所有废话是什么?我没有回答他的问题,或者至少是暗示的问题吗?)