phpbar.de logo

Mailinglisten-Archive

[php] Mysql - Spaltenabfrage

[php] Mysql - Spaltenabfrage

Alex Killing alexkill_(at)_mail.online-club.de
Thu, 01 Jul 1999 11:56:34 +0200


Rudolf Koch schrieb:
> Jein, ich muss jeweils nur für jeden User einzeln Daten, abfragen, das
> Problem ist aber, daß ich nicht weiß, was schneller und effektiver von den
> oben genannten Möglichkeiten ist. Wenn ich für jeden User eine eigene
> Tabelle habe, müsste ich nur auf die zugreifen. Wenn ich alle in einer
> Tabelle habe, weiß ich ob es sehr viel langsammer wird, wenn er alle User
> überprüft, wer denn jetzt so heißt.

Um Gottes Willen, so funktioniert das nicht. Du hast ja einen
primary-key auf die User-ID. Der Zugriff über einen Key ist im Vergleich
zum gesamten Durchsuchen einer Tabelle superschnell. Die Zugriffszeit
ist durch log(n) begrenzt (Basis 2, n ist die Anzahl der Datensätze). Um
eine Tabelle mit 100.000 Datensätzen zu durchsuchen sind also nicht
maximale (worst case) 100.000 Schritte sondern max. 17 Schritte nötig.
Das ist hyperschnell und schneller, als wenn Du mit untenstehender
Lösung eine while-Schleife bastelst.

> Die Datei wird so aufgerufen:
> http://localhost/projects/counter/counter?user=Klaus
> Wenn ich dann eine Tabelle hab, muss er den User Klaus suchen, wenn ich
> viele Tabelle habe ruft er die Tabelle Klaus_data auf und holt sich die
> Werte. Da ich vermute, daß die zweite Lösung besser ist brauche ich eine
> Möglichkeit um alle Zeilen einer SPALTE auszulesen. Also so z.b.:
> 
> Name - Value
> User - Klaus
> Password - xyz
> 
> Ich kann aber nicht alle Daten in dieser Tabelle in einer Zeile nehmen, weil
> ich auch den Namen manchmal verändern muss und die Tabelle um Felder
> erweitern. Deshalb war das mit einer Tabelle nur eine Notlösung.
> 
> Also benötige ich den genannten Befehl.

Den gibt es nicht. Die Verarbeitung funktioniert immer zeilenweise. Wenn
Du also ein komplette Spalte haben willst, mußt Du Dir alle Zeilen holen
und darüber mit einer while($rec=mysql_fetch_array(...)) { ... }
Schleife drüber gehen was definitiv langsamer ist als die
"Ein-Tabellen-Lösung". (Du kannst auch mit mysql_result in eine
bestimmte Zeile/Spalte springen, diese Lösung halte ich aber für noch
schlechter).

Es gibt wirklich nur zwei vernünftige Möglichkeiten (untested):

create table userdata (
  user varchar(20) not null primary key,
  passwd varchar(20),
  name ...,
  vorname ...,
  ...
)

oder

create table userdata (
  user varchar(20) not null primary key,
  parameter varchar(20) not null primary key,
  value varchar(200)
)

Im zweiten Fall ist das Auftauchen neuer Parameter völlig
unproblematisch, Du brauchst keine Änderungen an der Tabelle vorzunehmen
und auch der erste Fall ist mit einem gepflegten "alter table add column
..." in den Griff zu bekommen.

Und nochmal : Für jeden Benutzer eine eigene Tabelle anlegen ist
aufwendig, vor allem, wenn an den Tabellen nachträglich Änderungen
vorgenommen werden sollen. Und nehmen wir mal an Du hast ein Feld
"Nachname" in Deiner User-Tabelle und möchtest nun rausfinden welche
Deiner Benutzer "Müller" heißen. Wie willst Du eine solche Abfrage mit
deinen x-Tabellen realisieren ? Der Zugriff ist ja nur über den
Usernamen möglich, alle anderen Abfragen sind unmöglich (ok, es gibt
extrem aufwendige Möglichkeiten ...)

Gruss
Alex (!=Axel)


php::bar PHP Wiki   -   Listenarchive