"Christmas - the time to fix the computers of your loved ones" « Lord Wyrm

Mysql Speed

Maehmann 20.02.2003 - 22:13 4818 44
Posts

watchout

Legend
undead
Avatar
Registered: Nov 2000
Location: Off the grid.
Posts: 6845
Zitat von rettich
was ist schneller: ein "select *" wo das genre als varchar drin steht oder ein integer-wert mit einem "join" auf die genre-tabelle :confused:

ich nehme, es ist nicht der join. die vom db-server übertragene datenmenge bleibt aber gleich.

(wobei ich natürlich zustimme: mit einer genre-table ist das db modell sauberer, egal, wie viel zeit das kostet :))
die vom datenbankserver übertragene menge bleibt klarerweise gleich, jedoch arbeitet der server schneller, da ja die gespeicherte

eine zweite möglichkeit wären zwei separate abfragen, wo die genre-table einzeln abgefragt und dann mittels php die werte eingesetzt werden. bei der variante wird auch die übertragene datenmenge geringer - obwohl diese methode nicht 100% "sauber" is sollte man sie erwägen ;)

Maehmann

OC Addicted
Avatar
Registered: Aug 2002
Location: Vienna
Posts: 1110
Ich versuch grad die alte Tabelle so zu konvertieren, dass nur mehr die IDs drinnen stehen.
Leider gibts dabei einige Probleme.
Ich hab die alte Tabelle nur mehr auf meinem Webserver und dort dürfen keine Daten verloren gehen --> Testen am internen Webserver im LAN.
Dachte ich mir also, dass ich die daten als csv exportier und dann mit einem script umwandel und in die interne Datenbank schreibe.
Klingt alles recht einfach.
Leider bricht der Sack bei manchen Filmen einfach ab und bei manchen schreibt er von den anmerkungen nur den ersten Buchstaben in die Tabelle (!!!) :bash: :bash:
Da das ganze bei 98% aller Filme problems funkt dürfte das Script funktionieren nur irgendwelche Details der anderen Filme ausser Acht lassen.
Leider finde ich absolut nichts auffälliges bei den "spinnenden" Filmen *argl*

Maehmann

OC Addicted
Avatar
Registered: Aug 2002
Location: Vienna
Posts: 1110
Sodala.
Hab die Tables jetzt mal fertig umgestellt.
Eine SELECT * FROM filme Abfrage ist damit tatsächlich schneller (0,25secs gegen vorher 0,44secs).
Sobald aber ein ORDER BY dazu kommt, ist es wieder das selbe von rund 0,38 secs (ohne indices).
Die genau Abfrage schaut so aus:

SELECT f.id, f.titel, f.datum, f.cds, f.anmerkungen, g.genre, co.codec_vid, c.codec_aud, q.quali, u.username, s.sprache FROM filme f, codec_vid co, codec_aud c, genre g, quali q, sprache s, user u WHERE f.genre = g.id and f.codec_vid = co.id and f.codec_aud = c.id and f.sprache = s.id and f.quali = q.id and f.besitzer = u.id ORDER BY genre

Dann hab ich für alle Spalten indices gesetzt und das ganze nochmal probiert.
ORDER BY genre ist damit schneller (0,25secs) alle anderen Abfragen dauern genauso 0,38secs.
Aufgebaut sind Tabellen für (genre, codec_vid, codec_aud, sprache, ...) alle gleich. Ein Feld id (Primary Key, unique, tinyint(2)) ein Feld für die Daten (Varchar, Länge 4-20)

watchout

Legend
undead
Avatar
Registered: Nov 2000
Location: Off the grid.
Posts: 6845
und was spricht bitte gegen 0,38 sec das ist eh recht gut... ich hab die erfahrung gemacht, dass meistens php schnell, aber mysql verdammt lahm is bei den anbietern...

ps: wenn du queries so schreibst sind sie auch bei grösserer länge durchaus übersichtlich:
Code:
SELECT
	f.id,
	f.titel,
	f.datum,
	f.cds,
	f.anmerkungen,
	g.genre,
	co.codec_vid,
	c.codec_aud,
	q.quali,
	u.username,
	s.sprache
FROM
	filme f,
	codec_vid co,
	codec_aud c,
	genre g,
	quali q,
	sprache s,
	user u
WHERE 
	f.genre = g.id and
	f.codec_vid = co.id and
	f.codec_aud = c.id and
	f.sprache = s.id and
	f.quali = q.id and
	f.besitzer = u.id
ORDER BY genre

Maehmann

OC Addicted
Avatar
Registered: Aug 2002
Location: Vienna
Posts: 1110
gegen die 0,38secs hab ich eh nix ;)

Mich würd nur interessieren warum ORDER BY genre um so viel schneller ist, als zB ORDER BY sprache obwohl die entsprechenden indices da sind uns auch die Tabellen mehr oder weniger gleich sind.

PS: Die Tests laufen bei mir auf einem internen Rechner und nicht bei meinem Hoster. Noch nicht ;)
Erst muss ich mal das komplette Script umschreiben ;) Das läuft ja schon als Betaversion und die User schreiben schon fleißig ihre Daten in die DB ;)

atrox

in fairy dust... I trust!
Avatar
Registered: Sep 2002
Location: HTTP/1.1 404
Posts: 2782
hast du einen eigenen index fürs genre-feld, oder einen kombinierten über mehrere felder (so wie du es vorher gemacht hast?)

Maehmann

OC Addicted
Avatar
Registered: Aug 2002
Location: Vienna
Posts: 1110
ich hab für jedes Feld einen eigenen Index gemacht. Hab daweil noch keine kombinierten vergeben.

Morpheus84

Big d00d
Avatar
Registered: Jan 2002
Location: Vienna
Posts: 238
@ Maehmann

was ist das für ein prog mit dem du deine sql db verwaltest ? (das vom screenie)

noledge

CWNE #540
Avatar
Registered: Apr 2001
Location: ::1
Posts: 6837
Zitat von Morpheus84
@ Maehmann

was ist das für ein prog mit dem du deine sql db verwaltest ? (das vom screenie)

mysqlfront für windows

Maehmann

OC Addicted
Avatar
Registered: Aug 2002
Location: Vienna
Posts: 1110
jop, so is es :)

Dazu musst halt von aussen Zugriff auf die Datenbank haben.

Snoop

Here to stay
Registered: Jun 2002
Location: Gablitz
Posts: 1088
Maehmann, mach auch ich schätze mal dass du auch mit mysql_fetch_array arbeitest.... mach mal mysql_fetch_array($catch, MYSQL_ASSOC); das beschleunigt die ganze sache auch wieder, weiters empfehle ich dir mit klassen zu arbeiten, da es
1. Viel angenehmer zum worken ist
2. Lustigerweise um einiges schneller läuft

Ich hab z.B bei meinem Forum wo es über 6000 Einträge gibt, eine Rendertime von : 0,03 Sec.... (wenn net grad cs.gamer-scene.com 170 user online hat ;) ) um speed mit mysql db´s zu gewährleisten sind auch mysql_num_rows ein Tabu :) benütz da lieber SELECT count(id) FROM.... und wie gesagt, es hängt nicht alles vom script ab :) aber das meiste halt schon, wenn der mysql server voll überlastet is, kann auch das schnellste script lahm werden ;)

so long...
MFG

Maehmann

OC Addicted
Avatar
Registered: Aug 2002
Location: Vienna
Posts: 1110
thx für die tips ... mit Klassen hab ich leider noch überhaupt nichts gemacht.

Noch ein Frage ;)
Ist printf verglichen mit echo schneller?

Snoop

Here to stay
Registered: Jun 2002
Location: Gablitz
Posts: 1088
echo is schneller soweit ich weiss ;)

Maehmann

OC Addicted
Avatar
Registered: Aug 2002
Location: Vienna
Posts: 1110
na dann brauch ich nix umstellen ;)

Maehmann

OC Addicted
Avatar
Registered: Aug 2002
Location: Vienna
Posts: 1110
Möcht keinen neuen Thread aufmachen ---> deshalb hier rein ;)

Mein Query schaut so aus:
"SELECT * FROM filme WHERE $where ORDER BY $sortby ASC LIMIT $array[0],50;"

Funzt auch, nur halt nicht ganz so wie ich will ;)
Es soll nämlich zuerst LIMIT angewendet werden und dann soll das ganze sortiert werden.

Ich hab mir auch schon überlegt einfach WHERE id BETWEEN $array[0] AND $array[0]+50 zu nehmen ... das haut solange hin, bis ein Datensatz dazwischen gelöscht wurde. Damit würden dann nur mehr 49 statt 50 ausgegeben usw. ...

Hat wer eine Idee wie ich das lösen könnt?
Kontakt | Unser Forum | Über overclockers.at | Impressum | Datenschutz