Gestern hatte ich eine Frage wo die Leute vorschlugen, ich solle Levenshtein Methode. Ist es eine langsame Abfrage? Vielleicht kann ich etwas anderes verwenden?
Antworten
Zu viele Anzeigen?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
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;