Zum Beispiel habe ich 3 Tabellen: user
, group
und permission
, und zwei many2many Beziehungen zwischen ihnen: user_groups
und group_permissions
.
Ich muss alle Berechtigungen eines bestimmten Benutzers ohne Wiederholungen auswählen. Jedes Mal, wenn ich auf ein ähnliches Problem stoße, kann ich nicht feststellen, welche Version einer Abfrage besser ist:
%Vor%Ich habe genügend Erfahrung, um Schlussfolgerungen zu machen, die auf Erklärungen basieren. Die erste Abfrage hat eine Unterabfrage, aber meine Erfahrungen haben gezeigt, dass die erste Abfrage schneller ist. Vielleicht wegen der großen Anzahl von gefilterten Berechtigungen im Ergebnis.
Was würden Sie in dieser Situation tun? Warum? Danke!
Verwenden Sie EXISTS statt DISTINCT
Sie können die Anzeige von doppelten Zeilen mit DISTINCT unterdrücken; Sie verwenden EXISTS, um das Vorhandensein von Zeilen zu überprüfen, die von einer Unterabfrage zurückgegeben werden. Wann immer möglich sollten Sie EXISTS anstelle von DISTINCT verwenden, da DISTINCT die abgerufenen Zeilen sortiert, bevor die doppelten Zeilen unterdrückt werden.
In Ihrem Fall sollten viele duplizierte Daten vorhanden sein, so dass die vorhandenen Daten schneller sein sollten.
Tags und Links mysql performance inner-join distinct explain