3 Stimmen

Ist Levenshtein in MySQL langsam?

Gestern hatte ich eine Frage wo die Leute vorschlugen, ich solle Levenshtein Methode. Ist es eine langsame Abfrage? Vielleicht kann ich etwas anderes verwenden?

3voto

NikiC Punkte 98746

Sie können die BENCHMARK Funktion, um die Leistung zu testen:

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

Testen Sie es vielleicht mit verschiedenen Zeichenketten, die Ihrem Anwendungsfall entsprechen.

1voto

Felix Eve Punkte 3676

Das hängt von Ihrem Datensatz ab.

Ich habe festgestellt, dass ich das Verfahren erheblich beschleunigen kann, wenn ich nur Zeichenketten ähnlicher Länge vergleiche.

Wie ähnlich die Länge der Zeichenketten sein muss, hängt von Ihren Daten ab.

Hier finden Sie einen Artikel zu diesem Thema: http://kerbtier.ch/2008/12/30/levenshtein-to-slow-how-to-speed-it-up

0voto

symcbean Punkte 46489

Wenn Sie wollen, dass es gut läuft, dann Ihr Schema normalisieren .

Das Problem besteht darin, dass das DBMS, um zu ermitteln, wie ähnlich andere Daten sind, diese Daten laden und mit dem Datum vergleichen muss. Es muss also jede einzelne Zeile der Tabelle (außer der aktuellen) lesen, um "ähnliche" Werte zu finden. Es kann keine Indizes verwenden, um Daten zu finden, die dem Bezugspunkt ähnlich sind.

Wenn Sie hingegen ein Schema wie dieses verwenden:

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 die Zeichenfolge about_member (1-1-2-2-1) als getrennte Zeilen implementiert werden sollte, z. B.

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

Dann können Sie die Indizes affektiv nutzen, 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;

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X