Danke, also du scheinst dein handwerk zu verstehen. Also ich habe jetzt nur durch das ändern der Feld typen fast nen viertel kürzere Ladezeit. Hier einmal meine änderungen:
keywords
CODE CREATE TABLE keywords (
id int(11) NOT NULL auto_increment,
anzeigeid int(11) NOT NULL default '0',
userid int(11) NOT NULL default '0',
keyword varchar(50) NOT NULL default '',
PRIMARY KEY (id),
KEY anzeigeid (anzeigeid)
) TYPE=MyISAM;
anzeige
CODE CREATE TABLE anzeige (
id int(11) NOT NULL auto_increment,
userid int(11) NOT NULL default '0',
anzeige text NOT NULL,
ueberschrift varchar(50) NOT NULL default '',
linktext varchar(50) NOT NULL default '',
link varchar(255) NOT NULL default '',
art int(1) NOT NULL default '0',
kosten int(4) NOT NULL default '0',
breite int(3) NOT NULL default '0',
hoehe int(3) NOT NULL default '0',
PRIMARY KEY (id)
) TYPE=MyISAM;
users
CODE CREATE TABLE users (
UserID int(11) NOT NULL auto_increment,
UserName varchar(150) NOT NULL default '',
UserPass varchar(32) NOT NULL default '',
UserSession varchar(32) default NULL,
eingeloggt int(11) NOT NULL default '0',
zuletzt int(11) NOT NULL default '0',
vorname varchar(30) NOT NULL default '',
nachname varchar(30) NOT NULL default '',
strasse varchar(150) NOT NULL default '',
plz int(5) NOT NULL default '0',
ort varchar(50) NOT NULL default '',
land varchar(20) NOT NULL default '',
telefon varchar(20) NOT NULL default '',
firma varchar(100) NOT NULL default '',
bankname varchar(255) NOT NULL default '',
kontonummer int(11) NOT NULL default '0',
blz int(11) NOT NULL default '0',
paypal varchar(150) NOT NULL default '',
pgeld int(11) NOT NULL default '0',
ageld int(11) NOT NULL default '0',
PRIMARY KEY (UserID),
UNIQUE KEY NickName (UserName)
) TYPE=MyISAM;
QUOTE ... muss denn fast jedes Feld vom Type 'text' sein?
Also jetzt habe ich garkein Text feld mehr.
QUOTE Kleine Frage noch, speicherst Du in dem Feld 'keyword' bei der Tabelle 'keywords' ein Wort oder mehrere? - Nach Deiner Abfrage zu urteilen, vermute ich mal nicht.
Warum ist dann das Feld 'keyword' vom Typ 'text'? - 255 Zeichen sollten doch auch reichen.
Ja ich speichere dort auch z.b. "Vielen Dank" ab. Also mehrere Wörter jedoch habe ich das Feld jetzt in den typ varchar geändert und auf 50 Zeichen begrenzt da dieses eigentlich nicht überschritten wird.
QUOTE Zum Hardware-Kauf kann ich nur sagen, dass man kann durch die Optimierung einer Abfrage meistens mehr als das 1000 fache an Geschwindigkeit herausholen. Durch den Umzug auf einen schnelleren Server aber oft nicht mehr als das 10 fache an Geschwindigkeit. Bei der Hardware kommt es auch ganz auf die Aufgaben des Datenbank-Servers an... (meistens sollte aber die I/O-Last sehr hoch sein, Festplatte usw.)
Das beste wird voll beides sein. Eine optimierte tabellen Strucktur plus abfragen und die dazu gehörige Leistung der Server landschaft.
QUOTE Apropro, sehr empfehlenswertes Buch, vorausgesetzt man kenn schon die Grundlagen von Datenbank und ist einigermaßen mit der MySQL-Abfragesprache vertraut: High Performance MySQL - Optimierung, Datensicherung, Replikation & Lastverteilung" von O'Reilly
Ich kaufe mir zwar ehr selten solche literatur, aber dies scheint mir eine lohnende Investition! Danke für die Empfehlung
QUOTE <edit>
Ein Index auf das Feld 'anzeigenid' in der Tabelle 'keywords' wäre aber auf jedenfall noch ratsam, da dies der Fremdschlüssel für die Beziehung darstellt.
</edit>
Also immer wenn ich andere Indexe setze dauert die Abfrage länger. Eventuell ändert sich dieser Zustand erst wenn auch in der "anzeigen" Tabelle einige Daten vorhanden sind. Dies werde ich dann mal im Testbetrieb näher verfolgen.
QUOTE Ich vermute mal, es lässt sich wesendlich mehr Preformance bei den Abfragen erzielen, wenn Du Deine Tabellen erstmal vernünftig optimiert hast. Nach der Optimierung kann man sich dann erst Gedanken machen, wie man die Datenbank-Abfrage am sinnvollsten beschleunigen kann, auch wie und wo man entsprechende Indexe einbaut.
Wie oben geschrieben ist durch die Tabellen optimierung auf jeden fall einiges an Performance raus zu holen.
Wenn du noch weitere Ideen hast , z.b. nun auf die Abfrage betreffend würde ichz mich sehr freuen.
<edit>
Ich habe mir auch noch einige gedanken über die optimierung gemacht und mir sind folgende Ideen gekommen, wo ich aber nicht weiß wie man diese umsetzen kann.
1. Ich gruppiere ja die Datensätze, da es sehr viele datensätze gibt die doppelt vorkommen. Kann man es nicht irgendwie so machen das er erst gruppiert, damit es weniger datensätze sind?
2. Ich überprüfe ja mit:
anzeige.kosten <= users.ageld
ob der user genügend geld auf seinem konto hat. Das macht er ja denke ich mit jedem datensatz. Aber da so ca. 3000 Datensätze (keywords) zu einem user gehören, könnte man es nicht nur einmal überprüfen lassen?
3. Ist es sinvoll mit join zu arbeiten anstatt die abfrage z.b. einzeln dann in der While schleife zu behandeln?
Ich hoffe ich habe die ideen sind nicht all zu weit hergeholt, da es ja doch schon sehr spät ist und ich sehr müde, doch ich musste jetzt meine gedanken ströme loswerden ;-)
</edit>
Vielen, Vielen, Vielen, Vielen, Dank an dieser Stelle.
PS: Ich verfalle gerade in einen richtigen optimierungs wahn meiner gesamten Tabellen Struckturen, auch von anderen projekten.