2015-10-11 20 views
-3
/*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 

在一個過程中使用此函數,在搜索輸入和列上應用該函數。工作正常,但絕對不可擴展。優化此MySQL查詢不使用函數

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

你想[代碼審查(HTTP:// codereview.stackexchange.com/),而不是Stack Overflow。 – cybermonkey

+1

對於我來判斷這個問題應該發生在哪裏,這太細。我在這裏有關於性能優化的一百萬個問題。我希望你沒有因爲這個原因而投票。 –

+0

哇! 3倒票,但沒有人在意解釋爲什麼! –

回答

0

LIKE '%...'根本沒有優化。它會做表掃描。因此,這個是「不可擴展」的主要部分。相比之下,功能等是微不足道的。

那麼,該怎麼辦?看看FULLTEXT看看你是否可以使用它。它可能需要改變用戶的期望 - 它會查找整個單詞,而不是任意的子字符串。但它更快,更具可擴展性

使用FULLTEXT將消除對您的Sanitize功能的需求。

(所以,夥計們,什麼是所有的垃圾約downvoting和關閉問題有沒有我回答他的問題,或至少隱含的問題?)