Abfrage optimieren

Ich bin nicht gerade das, was man als Datenbank-Guru bezeichnen wuerde, daher hoffe ich mal dass sich hier jemand finden laesst der mir sagen kann ob sich folgende Abfrage noch ein wenig optimieren laesst:
Code:
select
	permissions.id
from users

left join users_permissions
       on users_permissions.user = users.id

left join users_roles
       on users_roles.user = users.id

left join roles_permissions
       on roles_permissions.role = users_roles.role

left join permissions
       on permissions.id = users_permissions.permission
       or permissions.id = roles_permissions.permission

where users.id = 0815

group by (permissions.id)
order by (permissions.id) ASC;

Es gibt 6 Tabellen:
Code:
 - users
 - roles
 - permissions
 - users_roles
 - users_permissions
 - roles_permissions
Die Namen sollten selbsterklaerend sein. Fall nicht:
Ein User (users) soll Berechtigungen (permissions) sowohl ueber die Gruppe(n) (roles) der/denen er zu zugeordnet ist (roles_permissions), als auch individuell dem user zugeordnete (users_permissions) Berechtigungen erhalten.

users
  • Die Usertabelle mit Grundlegenden informationen ueber den User.
  • Spalten: id, name, ...
  • Primaerschluessel: id
  • Fremdschluessel: -

roles
  • Die Tabelle mit den Berechtigungsgruppen
  • Spalten: id, name, ...
  • Primaerschluessen: id
  • Fremdschluessel: -

permissions
  • Die Tabelle mit den Verfuegbaren Berechtigungen
  • Spalten: id, name, ...
  • Primaerschluessen: id
  • Fremdschluessel: -

users_roles
  • Die Tabelle die die User den Gruppen zuordnet (M zu N Beziehung)
  • Spalten: user, role
  • Primaerschluessen: (user, role)
  • Fremdschluessel: user => users.id, role => roles.id

users_permissions
  • Die Tabelle die die User den Berechtigungen zuordnet (M zu N Beziehung)
  • Spalten: user, permission
  • Primaerschluessen: (user, permission)
  • Fremdschluessel: user => users.id, permission => permissions.id

roles_permissions
  • Die Tabelle die die Gruppen den Berechtugungen zuordnet (M zu N Beziehung)
  • Spalten: role, permission
  • Primaerschluessen: (role, permission)
  • Fremdschluessel: role => roles.id, permission => permission.id

(ich habe auf die schnelle kein Programm gefunden mit dem ich ein ordentliches ER-Modell erstellen kann. Daher mal in Textform)

MfG
- Keks
 
Bau dir einen View im SQL Server der kann das intern schneller abhandeln.
 
Ich rate jetzt einfach mal daß du MySql benutzt. Google mal nach MySql Explain. Das zeigt dir die schwächen deines Selects. Ich geh mal davon aus daß du Indezes angelegt hast.

odigo
 
Zurück
Oben