watchout
Legendundead
|
was 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 ) 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
|
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*
|
Maehmann
OC Addicted
|
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
Legendundead
|
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
|
Maehmann
OC Addicted
|
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!
|
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
|
ich hab für jedes Feld einen eigenen Index gemacht. Hab daweil noch keine kombinierten vergeben.
|
Morpheus84
Big d00d
|
@ Maehmann
was ist das für ein prog mit dem du deine sql db verwaltest ? (das vom screenie)
|
noledge
CWNE #540
|
@ 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
|
jop, so is es Dazu musst halt von aussen Zugriff auf die Datenbank haben.
|
Snoop
Here to stay
|
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
|
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
|
echo is schneller soweit ich weiss
|
Maehmann
OC Addicted
|
na dann brauch ich nix umstellen
|
Maehmann
OC Addicted
|
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?
|