Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Es ist ein Rat erforderlich, um eine Tabelle mit vielen zu durchsuchenden Feldern richtig zu indizieren

Ich habe eine Tabelle mit der gleichen Art von Dingen, vielen Spalten und 1000 verschiedenen Auswahlmöglichkeiten. Es ist ein Albtraum. Ich habe jedoch festgestellt, dass bestimmte Kombinationen von Filtern häufig verwendet werden. Für diese würde ich Indizes erstellen und die anderen, die selten verwendet werden, langsam laufen lassen. In MSSQL kann ich eine Abfrage ausführen, um mir die teuersten Abfragen anzuzeigen, die für die Datenbank ausgeführt wurden, mySQL sollte eine ähnliche Sache haben. Sobald ich sie habe, erstelle ich einen Index, der die Spalten abdeckt, um sie zu beschleunigen. Schließlich haben Sie es zu 90 Prozent abgedeckt. Ich persönlich würde nie wieder so einen Tisch entwerfen, es sei denn, ich hätte eine AK47 auf mich gerichtet. (Meine Indizes sind dreimal größer als die Daten in der Tabelle, was sehr uncool ist, wenn Sie einen Haufen oder Datensätze hinzufügen müssen). Ich bin mir jedoch nicht sicher, wie ich die Tabelle neu gestalten würde. Mein erster Gedanke wäre, die Tabelle in zwei Teile zu teilen , aber das würde an anderer Stelle zu Kopfschmerzen führen.

Benutzertabelle (Benutzer-ID, Name)

1, Lisa
2, Jane
3, John

Benutzerattributtabelle (Benutzer-ID, Attributname, Attributwert)

1, EYES, Brown
1, GENDER, Female
2, EYES, Blue
2, GENDER, Female
3  EYES, Blue
3, GENDER, Male

Dies würde das Identifizieren von Attributen beschleunigen, aber Ihre Abfragen nicht so einfach zu schreiben machen.

SELECT UserID, COUNT(*) as MatchingAttributes
FROM   UserAttributes 
WHERE  (UserAttributes.AttributeName = 'EYES' AND UserAttributes.AttributeValue = 'Blue') OR
       (UserAttributes.AttributeName = 'GENDER' AND UserAttributes.AttributeValue = 'Female') 

Dies sollte Folgendes zurückgeben

UserID, MatchingAttributes
1, 1
2, 2
3, 1

Alles, was Sie dann tun müssen, ist, der Abfrage ein HAVING COUNT(*) =2 hinzuzufügen, um nur die übereinstimmenden IDs auszuwählen. Die Auswahl ist etwas komplizierter, aber es bietet auch eine nette Funktion, sagen Sie, Sie filtern nach 10 Attributen und geben alle diejenigen zurück, die 10 Übereinstimmungen haben. Cool, aber sagen Sie, keiner stimmte zu 100 % überein. Man könnte sagen, hey, ich habe keine Übereinstimmung gefunden, aber diese hatten 9 von 10 oder eine Übereinstimmung von 90 %. (Stellen Sie nur sicher, dass ich, wenn ich nach einer blauäugigen blonden Frau suche, keine Meldung erhalte, dass keine gefunden wurde, aber hier sind die nächstbesten übereinstimmenden, die blauäugige blonde Typen mit einem Matching-Score von 60% enthalten. Das würde sehr uncool sein)

Es gibt noch mehr Dinge, die berücksichtigt werden müssten, wenn Sie sich entscheiden, die Tabelle zu teilen, wie zum Beispiel, wie speichern Sie Attribute als Zahlen, Daten und Text in einer einzigen Spalte? Oder sind das separate Tabellen oder Spalten. Keine einfache Antwort, weder Wide Table noch Split Tables.