2010-08-09 78 views
1

昨天我有一個question人們建議我用Levenshtein的方法。這是一個緩慢的查詢?也許我可以使用別的東西?Levenshtein在MySQL中很慢嗎?

+0

我想幫助,但問題是非常廣闊的。專注於特定的作品會讓討論和提供建議更容易。 – 2010-09-13 19:22:45

+6

如果您有其他問題,請提出一個新問題。不要完全改變你現有的一個。 – Greg 2010-09-13 20:29:43

+0

沒有關於它的規則,所以你不能編輯我的帖子。 – 2010-09-14 15:17:38

回答

3

可以使用BENCHMARK功能來測試性能:

SELECT BENCHMARK(10000, LEVENSHTEIN('abc', 'abd')); 

也許類似於你的使用情況不同的字符串進行測試。

+1

LEVENSHTEIN不是一個集成的MySQL函數。它是用戶定義的功能。你需要用C編寫它。閱讀提供的鏈接到另一個相關的StackOverflow問題。 – 2010-08-09 13:40:32

0

如果你想要它的表現不錯,那麼規範你的模式

問題是,爲了確定其他數據的相似程度,DBMS必須加載該數據並將其與數據進行比較。所以它必須讀取表格中的每一行(除了當前行)以找到「相似」值。它不能使用索引來查找接近數據的數據。

如果,另一方面,你用這樣的模式:

CREATE TABLE member (
    member_id  INT(11), 
    member_data CLOB, 
    PRIMARY KEY (member_id)); 

CREATE TABLE about_member (
    member_id  INT(11), 
    metric   VARCHAR(10), 
    value   MEDIUMINT(9), 
    PRIMARY KEY (member_id, metric), 
    KEY by_value (metric, value, member_id)); 

請注意,您about_member(1-1-2-2-1)字符串應該被實現爲單獨的行,例如

member_id  metric  value 
1234   lost  2 
1234   won   3 
1234   drawn  1 
1234   handicap 9 

然後,您可以有效地使用索引,例如使用以下查詢。

SELECT compare.member_id, SUM(ABS(compare.value-datum.value)) AS difference 
FROM about_member compare, about_member datum 
WHERE datum.member_id=$MEMBER_TO_COMPARE 
AND compare.member_id<>datum.member_id 
AND compare.metric=datum.metric 
AND compare.metric BETWEEN (datum.metric-1) AND (datum.metric+1) /* tweak here */ 
GROUP BY compare.member_id;