URL: https://www.overclockers.at/coding-stuff/mysql_speed_68187/page_2 - zur Vollversion wechseln!
die vom datenbankserver übertragene menge bleibt klarerweise gleich, jedoch arbeitet der server schneller, da ja die gespeicherteZitat von rettichwas ist schneller: ein "select *" wo das genre als varchar drin steht oder ein integer-wert mit einem "join" auf die genre-tabelle
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)
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 (!!!)
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*
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)
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: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
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
hast du einen eigenen index fürs genre-feld, oder einen kombinierten über mehrere felder (so wie du es vorher gemacht hast?)
ich hab für jedes Feld einen eigenen Index gemacht. Hab daweil noch keine kombinierten vergeben.
@ Maehmann
was ist das für ein prog mit dem du deine sql db verwaltest ? (das vom screenie)
Zitat von Morpheus84@ Maehmann
was ist das für ein prog mit dem du deine sql db verwaltest ? (das vom screenie)
jop, so is es
Dazu musst halt von aussen Zugriff auf die Datenbank haben.
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
thx für die tips ... mit Klassen hab ich leider noch überhaupt nichts gemacht.
Noch ein Frage
Ist printf verglichen mit echo schneller?
echo is schneller soweit ich weiss
na dann brauch ich nix umstellen
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