Ist Levenshtein langsam in MySQL?
-
27-09-2019 - |
Frage
Gestern hatte ich eine Frage wo Leute vorgeschlagen, dass ich verwenden Levenshtein Methode. Ist es eine langsame Abfrage? Vielleicht kann ich etwas anderes verwenden?
Lösung
Sie können mit der BENCHMARK
Funktion, um die Leistung zu testen:
SELECT BENCHMARK(10000, LEVENSHTEIN('abc', 'abd'));
Vielleicht testen Sie es mit verschiedenen Saiten ähnlich wie Ihren Anwendungsfall.
Andere Tipps
Es hängt von Ihrer Datenmenge.
Ich fand ich es deutlich nach oben beschleunigen könnte durch nur Strings ähnlicher Länge verglichen wird.
Wie ähnlich in der Länge müssen Sie die Saiten auf Ihre Daten hängen.
Es gibt einen Artikel über das Thema hier: http://kerbtier.ch/2008/12/30/levenshtein-to-slow-how-to-speed-it-up
Wenn Sie es wollen, eine gute Leistung dann normalisieren Ihr Schema .
Das Problem ist, dass, um zu bestimmen, wie ähnliche andere Daten, die DBMS, dass die Daten zu laden hat und vergleicht ihn mit dem Datum. So hat es (außer dem aktuellen) jede einzelne Zeile in der Tabelle zu lesen, durch zu finden ‚ähnlich‘ Werte. Es kann keine Indizes verwenden, um Daten zu finden, die in der Nähe des Nullpunkt ist.
Wenn auf der anderen Seite verwendet Sie ein Schema wie folgt aus:
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));
Beachten Sie, dass Sie about_member (1-1-2-2-1) Zeichenfolge sollte als separate Zeilen implementiert werden, z.
member_id metric value
1234 lost 2
1234 won 3
1234 drawn 1
1234 handicap 9
Dann können Sie die Indizes affektiv verwenden, zum Beispiel mit der folgenden Abfrage.
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;