phpbar.de logo

Mailinglisten-Archive

RE: Frage zum Aufbau einer table (ressourcen, performance)
Archiv Mailingliste mysql-de

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

RE: Frage zum Aufbau einer table (ressourcen, performance)



Um die Performance zu erhöhen, ist es grundsätzlich sinnvoll, diverse
Spalten auf mehrere Tabellen zu verteilen. Einige deiner Felder sind mir
allerdings nicht ganz klar. Was ist "visibility char(20)"? Wahrscheinlich
soll doch dort nur ein Y/N drinstehen. In diesem Fall nimm lieber ein
numerisches Feld, wo du 0/1 oder so einträgst.

In der Haupttabelle (oder Basistabelle = "dienewstabelle") sollten zunächst
nur die Felder auftauchen, die zur id einen 1:1-Bezug haben. Felder die
einen n:1 lassen sich ressourcensparend auslagern und n:m Beziehungen
sollten technisch immer über eine Hilfstabelle verknüpft werden. Teilweise
kompliziert sich hierzu zwar die Programmierung (keine sub-selects), aber
das kann ja noch kommen.

Beispiele:

#table basis, pk(basis_id)
basisid  feld_a_1z1  feld_b_1z1  typ_id  
1        ...         ...         1
2        ...         ...         1
3        ...         ...         2
4        ...         ...         3
5        ...         ...         3
6        ...         ...         3
7        ...         ...         4


#table typen, pk(typ_id)
typ_id   beschreibung
1        Tiere
2        Pflanzen
3        Autos
4        Getränke

Die Typ-Id läßt sich wunderbar joinen.

Um eine n:m-Beziehung auseinanderzubasteln brauchst Du eine Hilfstabelle.
Bezogen auf dich: Eine News hat mehrere Themen - ein Thema hat mehrere News.

Erstellen einer Themen-Tabelle:

#table themen , pk(themen_id)
themen_id  Beschreibung
1          Prozessor
2          Grafikkarten
3          Mainboards
4          Speicher 
5          Festplatten
6          Disketten

Erstellen einer Hilfstabelle
#table basis_themen, pk(basis_id, themen_id)
basis_id  themen_id
1         1
1         2
1         6
2         1
3         1
3         4
4         3
4         5
usw.

Über diese Tabelle bekommst Du zum Beispiel sehr performant heraus, welche
basis_id hat und welche Themen haben welche basis_id.

Ich hoffe, das waren ein paar Anregungen für dich. Ganz wichtig: Eine
komplexe Datenbank entwirft man auf dem Papier, nicht im Kopf. Nimm dir also
ein Blatt Papier, einen Bleistift und einen Radiergummi und beginne Kästchen
und Pfeile zu malen. Eine von Anfang nicht oder schlecht durchdachte
Datenbankstruktur wird später mit Kompromissen leben müssen. Ist die
Datenbank einmal gefüllt, sind Strukturänderungen oft mit mehr Aufwand
verbunden, als am Anfang.

Außerdem wichtig! Viele Keys sind nicht immer gut, vor allem, wenn die
Tabelle sehr dynamisch sind, da der Verwaltungsaufwand schnell ansteigt.
Nicht immer ist es sinnvoll, daß die Abfrage 1sec dauert, dafür das Einfügen
oder ändern 1min. (wegen vieler Keys). Deshalb möglichst den statischen Teil
vom dynamischen Teil in verschiedene Tabellen packen.

Bei deinem Beispiel sind solche Felder wie zB. text,more,site statischer
Teile. Die kommen einmal rein und werden bis zum Löschen nicht mehr
verändert. Die Spalte Hits dagegen ist dynamisch (Anzahl der Abfragen?).
Obwohl das eine 1:1-Beziehung ist, ist es besser, die Hits in eine andere
Tabelle zu packen, zum Beispiel:

#table hits pk(basis_id)
basis_id  hits
1         12
2         23
3         0
4         67

Überlegen solltest Du auch, was du mit dem "datestamp"-Feld erreichen
willst, den Zeitpunkt der Eintragung oder die letzte Aktualisierung oder die
letzte Abfrage. Für den Zeitpunkt der Eintragung nimmst du besser ein
date-feld, für den letzten hit packst du dann das datestamp-feld in die
obige Tabelle "Hits".

Naja, wie gesagt. Das sollen nur Anregungen sein. Weiß nicht, ob ich
Denkfehler drinnen habe.

Mfg. Sven Letzel.

-----Original Message-----
From: islistening_(at)_gmx.net [mailto:islistening_(at)_gmx.net]
Sent: Mittwoch, 22. September 1999 15:21
To: mysql-de_(at)_lists.4t2.com
Subject: Frage zum Aufbau einer table (ressourcen, performance)


Hallo Liste, 
 ich habe eine Frage zum moeglichst ressourcenschonenden Aufbau
 einer Tabelle, dh moeglichst schnellen Zugriff. Es handelt sich 
 dabei Newsseiten verschiedener Websites, die von einem PHP-script
 aus der MySQL-Datenbank generiert werden. Also ca 10.000 queries
 am Tag. Fuer Expertenhinweise waere ich dankbar.

 Nun habe ich noch wenig Erfahrung speziell im Erstellen von table
 strukturen, die momentane Table sieht wie folgt aus:

 CREATE TABLE dienewstabelle (
    id int(11) DEFAULT '0' NOT NULL AUTO_INCREMENT, 
    text blob DEFAULT '' NOT NULL, 
    more blob DEFAULT '' NOT NULL,
    datestamp datetime DEFAULT '0000-00-00 00:00:00' NOT NULL,
    name varchar(100) DEFAULT '' NOT NULL, 
    email varchar(100) DEFAULT '' NOT NULL,
    forumurl varchar (100),
    hits int(11),
    beitragstyp char(20) NOT NULL,
    site char(20) NOT NULL,
    thementyp char(20) NOT NULL,
    visibility char(20) NOT NULL,
    headline varchar(100) DEFAULT '' NOT NULL, 
    PRIMARY KEY (id),
    KEY datestamp (datestamp),
    KEY beitragstyp (beitragstyp),
    KEY site (site),
    KEY thementyp (thementyp),
    KEY visibility (visibility)
 );

 Die News-Seiten werden jeweils nach einem QUERY_STRING generiert: 
 zB newsysadmin.php3?name=Heraklit&visibility=N&orderby=datestamp 
 Daraus bastelt das PHP-script dann eine korrespondierende SQL-query: 
 SELECT * FROM teamplaydenews WHERE name=Heraklit AND visibility=N ORDER
BY
 datestamp 

 Weitere queries die so auch auftauchen koennten im taeglichen
 Betrieb:
 newsysadmin.php3?beitragstyp=kommentar&orderby=datestamp 
 newsysadmin.php3?beitragstyp=news&site=halflifede&orderby=datestamp


newsysadmin.php3?beitragstyp=news&site=halflifede&thementyp=mods&orderby=dat
estamp
 newsysadmin.php3?name=jo&$beitragstyp=news&orderby=datestamp&limit=30 

 newsysadmin.php3?beitragstyp=news&orderby=datestamp&orderby2=thementyp 
 Was muss ich bei einem Orderby mit 2 Argumenten beachten? Kann man
 die Tabellenstruktur so entwerfen, dass ein solches Orderby moeglichst
 gewschwind von der Datenbank generiert wird? Hier soll eine Newssite
 generiert werden die Thematisch geordnet ist, und dabei auch nach
 Datum (ein Beispiel waere www.wallstreet-online.de).

 Nun, wenn ich also im Moment die zusammengestellte SQL-Query so gegen
 die Tabelle laufen lasse, bekomme ich bei allen WHERE abfragen die
 Fehlermeldung *0 is not a MySQL result index*, das passiert bei allen
 queries ausser wenn ich sowas wie *...WHERE id=1* uebergebe, dh mit
 id funktionierts, bei anderen argumenten bekomme ich obige fehlermeldung.


 Eine weitere Frage: wenn ich ORDER BY datestamp verwende, dann werden
 die alten News zuerst ausgegeben. Wie kann ich erreichen, dass mir
 fuer meine Newsseiten jeweils die aufsteigender reihenfolge sortiert
 werden? ASC? DESC? Kann MySQL nach Datum ausgeben?  Wie muss ich meine
 table strukturieren, damit die *ORDER BY datestamp*-Ausgaben mit 2 
 argumenten besonders geschwind laufen?
  
 Letzlich noch die Frage, ob ich ueberhaupt eine einzige Tabelle
 verwenden sollte. Stellen schaetzungsweise 10000 Eintraege nach
 einem Jahr ein Performanceproblem bei der Abfrage der Tabelle dar?

 Wie sollte die oben dargestellte Tablestruktur besser aussehen, wenn
 sie die Forderungen erfuellen soll? ich koennte mir vorstellen das
 ich im table-entwurf etliche Anfaengerfehler gemacht habe.

 Danke im Vorraus

 --Heraklit

-- 
Sent through Global Message Exchange - http://www.gmx.net

---
*** Abmelden von dieser Mailingliste funktioniert per E-Mail
*** an mysql-de-request_(at)_lists.4t2.com mit Betreff/Subject: unsubscribe

---
*** Abmelden von dieser Mailingliste funktioniert per E-Mail
*** an mysql-de-request_(at)_lists.4t2.com mit Betreff/Subject: unsubscribe


Home | Main Index | Thread Index

php::bar PHP Wiki   -   Listenarchive