Frage

Ich habe eine MySQL -Tabelle mit 40 Millionen Datensätzen, die durch einen Prozess besiedelt werden, über den ich keine Kontrolle habe. Daten werden nur einmal im Monat hinzugefügt. Diese Tabelle muss mit der Spalte Name suchbar sein. Die Spalte Name enthält jedoch den vollständigen Namen im Format "Last First Middle".

Im sphinx.conf habe ich

sql_query = SELECT Id, OwnersName,
substring_index(substring_index(OwnersName,' ',2),' ',-1) as firstname, 
substring_index(OwnersName,' ',2) as lastname
FROM table1

Wie benutze ich die Sphinx -Suche, um nach FirstName und/oder LastName zu suchen? Ich möchte nur im Vornamen nach "Smith" suchen können?

War es hilfreich?

Lösung

Nach den anderen Antworten habe ich vielleicht etwas verpasst ... aber um eine Suche in Sphinx auf ein bestimmtes Feld einzuschränken, stellen Sie sicher, dass Sie den erweiterten (oder Extended2) Match -Modus verwenden und dann die folgende Abfragebarstellung verwenden: @firstname Smith.

Andere Tipps

Pro Reisfunktionen in SQL-Abfragen sind immer eine schlechte Idee für Tabellen, die groß werden können. Wenn Sie einen Teil einer Spalte suchen möchten, sollte sie in eine eigene Spalte extrahiert und indiziert werden.

Ich würde vorschlagen, wenn Sie über das Schema (im Gegensatz zum Bevölkerungsprozess) Strom haben und neue Spalten namens OwnersFirstName und OwnersLastName zusammen mit einem Update -Trigger einfügen, der die entsprechenden Informationen aus dem Besitzernamen extrahiert und die neuen Spalten angemessen populiert.

Dies bedeutet, dass der Aufwand für den Ermittlungen des Vornamens nur dann erfolgt, wenn eine Zeile geändert wird, nicht jedes Mal Sie führen Ihre Anfrage aus. Das ist der richtige Zeitpunkt dafür.

Dann werden Ihre Fragen blendend schnell. Und ja, das bricht 3NF, aber die meisten Menschen wissen nicht, dass es aus Leistungsgründen in Ordnung ist, vorausgesetzt, Sie verstehen die Konsequenzen. Und da die neuen Spalten durch die Auslöser gesteuert werden, ist die Datenverdoppelung, die Anlass zur Sorge wären, "sauber".

Die meisten Probleme, die Menschen mit Datenbanken haben, ist die Geschwindigkeit ihrer Fragen. Es ist normalerweise in Ordnung, ein wenig Speicherplatz zu verschwenden, um eine große Menge an Leistungsverbesserungen zu erzielen.

Wenn Sie absolut haben nein Wenn Sie selbst das Schema überlassen, besteht eine andere Möglichkeit darin, Ihre eigene Datenbank mit dem "richtigen" Schema zu erstellen und es regelmäßig aus der realen Datenbank zu füllen. Dann frag deine. Dies kann jedoch jeden Monat ein bisschen Datenübertragung beinhalten, sodass die erste Option die bessere, falls erlaubt ist.

Sie könnten Substring verwenden, um die Teile des Feldes zu erhalten, nach denen Sie suchen möchten, aber dies wird den Prozess verlangsamen. Die Abfrage kann keinen Index verwenden, um den Vergleich durchzuführen, daher muss sie jeden Datensatz in der Tabelle berühren.

Das Beste wäre nicht, mehrere Werte im selben Feld zu speichern, sondern die Namenskomponenten in drei separaten Feldern zu setzen. Wenn Sie mehr als einen Wert in einem Feld speichern, sind es fast immer Probleme, auf die Daten zuzugreifen. Ich sehe das immer und immer wieder in verschiedenen Foren ...

Dies ist ein unlösbar

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top