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?

War es hilfreich?

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;
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top