Mysql Speed - Seite 2

Seite 2 von 3 - Forum: Coding Stuff auf overclockers.at

URL: https://www.overclockers.at/coding-stuff/mysql_speed_68187/page_2 - zur Vollversion wechseln!


watchout schrieb am 21.02.2003 um 20:41

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 schrieb am 22.02.2003 um 10:31

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 schrieb am 23.02.2003 um 10:40

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 schrieb am 23.02.2003 um 14:39

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 schrieb am 23.02.2003 um 15:00

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 schrieb am 23.02.2003 um 15:36

hast du einen eigenen index fürs genre-feld, oder einen kombinierten über mehrere felder (so wie du es vorher gemacht hast?)


Maehmann schrieb am 23.02.2003 um 19:07

ich hab für jedes Feld einen eigenen Index gemacht. Hab daweil noch keine kombinierten vergeben.


Morpheus84 schrieb am 24.02.2003 um 03:39

@ Maehmann

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


noledge schrieb am 24.02.2003 um 07:53

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 schrieb am 24.02.2003 um 09:57

jop, so is es :)

Dazu musst halt von aussen Zugriff auf die Datenbank haben.


Snoop schrieb am 24.02.2003 um 13:45

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 schrieb am 24.02.2003 um 15:04

thx für die tips ... mit Klassen hab ich leider noch überhaupt nichts gemacht.

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


Snoop schrieb am 24.02.2003 um 15:35

echo is schneller soweit ich weiss ;)


Maehmann schrieb am 24.02.2003 um 15:44

na dann brauch ich nix umstellen ;)


Maehmann schrieb am 27.02.2003 um 18:42

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?




overclockers.at v4.thecommunity
© all rights reserved by overclockers.at 2000-2025