2016-07-29 13 views
0

Ich habe eine Tabelle in MySQL 5.7.13, die 3 Spalten hat (eigentlich mehr als das, aber diese drei werden für die Suche verwendet) - es hat eine Spalte company_id, es hat eine Spalte department_id, und es hat Spalte status.Wie Index richtig für eine große MySQL-Tabelle verwenden?

Jetzt arbeiten die Mitarbeiter normalerweise so, sie betreten das System, sie wählen das Unternehmen aus, mit dem sie arbeiten, und sie wählen die Abteilung (es ist obligatorisch). Danach gehen sie zum Menü und können entweder Daten aus der Tabelle abrufen, ohne den Status anzugeben, oder sie können auch angeben, welchen Status sie haben wollen.

So schien es mir natürlich, komplexe Index (company_id, department_id, Status), aufgrund der Präfix Reihenfolge von MySQL-Index. Da sie immer nach Firma und Abteilung und manchmal nach Status filtern, schien alles in Ordnung zu sein.

In letzter Zeit wurde jedoch eine neue Funktion hinzugefügt. Es gibt auch spezielle Mitarbeiter, die im Gegensatz zu den normalen Benutzern nur die Firma, aber nicht die Abteilung auswählen. Ihre Abfrage wird also nach Unternehmen und Status gefiltert. Und das bedeutet, dass der Index bricht, wird nur nach Unternehmen und nicht nach Status gefiltert, weil die Abteilung weggelassen wird.

Was ist ein Workaround? Ich sehe hier zwei Lösungen. Einer ist, dass der Status sehr eingeschränkt ist - er hat im Grunde genommen für Werte - CREATED (1), SENT (2), ACCEPTED (3), REJECTED (4). Also, ich kann erstellen Index (company_id, Status, department_id), und wenn der Benutzer keinen Status nicht wählen, kann ich in Abfrage so etwas wie dieses anhängen:

AND status in (1,2,3,4) 

Will Index Arbeit effizient für das? Oder eine andere Lösung besteht darin, den zweiten Index zu erstellen und beides zu haben (company_id, department_id, status) und (company_id, status, department_id), aber wird der mysql-Optimizer den richtigen Index auswählen? Ich bin mir nicht sicher, welcher Weg besser ist und jeder von ihnen wird funktionieren.

+0

Wie viele Zeilen in der Tabelle? Was ist eine typische Anzahl von Zeilen für eine Firma? Was ist das Maximum? Gibt es nur einen "Status" für eine "Firma + Abteilung"? –

Antwort

0

Von was ich sehen kann, sollte dies gut funktionieren. Der Optimierer verwendet einen Index für (x,y,z) Composite und führt bei Bedarf einen using index; using where aus. Beachten Sie, dass ich davon ausgehe, dass der am weitesten links liegende Teil des Composites bereits Teil Ihrer where-Klausel ist, z. B. x, sodass y bereits für den Index verwendet werden kann.

Auf eine andere Anmerkung, in Fällen, in denen IN Klausel ist sehr groß, und sagen auf einer einzigen Spalte Index, die IN wird schnell erfüllt werden. Siehe die Antwort, die ich hier geschrieben habe: Index uses IN.

Natürlich, schauen Sie sich die MySQL Handbuch Seite mit dem Titel EXPLAIN Syntax und etwas wie .