Performanceprobleme bei Mini-Produktdatenbank

gkette

Benutzer
Beiträge
16
Hallo, ich bin neu hier und habe direkt ein Problem. Ich betreue eine kleine Datenbank, in der Laptops gespeichert sind. Diese besteht aus Modellen, Herstellern und Varianten. Jedes Modell hat einen Hersteller, jede Variante gehört zu einem Modell. Des Weiteren liegen bei den Varianten ca. 10 weitere Fremdschlüsselbeziehungen vor, z.B. zu Grafikkarte, Display, Netzwerkkarte, etc. Eigentlich ein sehr simples Teil, sind aktuell auch nur ca. 10 Modelle und 40 Varianten der Modelle drin. Ich habe nun leider massive Performanceprobleme. Das Ganze liegt auf einem Webserver, die Abfrage dauert aktuell schon ca. 1-2 Sekunden. Wenn ich jetzt noch Laufwerk hinzunehme, steigt die Dauer auf ca. 10 Sekunden pro Abfrage. An der Tabelle Laufwerk scheint es nicht zu liegen, diese habe ich schon komplett neu erstellt. Was könnte das Problem sein? Die ID wird automatisch generiert, die Fremdschlüssel sind unsigned smallint. Als Engine wird myisam genutzt. Mit einer view habe ich es auch schon versucht, keinerlei Veränderungen. Wäre Klasse wenn jemand eine Idee hätte. Gruß, gkette
 
Werbung:

ukulele

Datenbank-Guru
Beiträge
4.579
Ich kann mir nicht vorstellen das eine DB mit 10 bzw. 40 Einträgen pro Tabelle aufgrund irgendeiner Fehlkonfiguration überhaupt langsam sein kann. Wie viele Zeilen gibt deine Abfrage denn aus?

Ich arbeite allerdings weder mit MySQL noch mit myisam. Als erstes solltest du mit einem Admin Tool mal schauen, ob die selbe Abfrage auch so lange dauert.
 

gkette

Benutzer
Beiträge
16
wenn ich es in phpmyadmin ausführe dauert es ebenfalls Ewigkeiten (ohne Laufwerk 3-4 Sekunden, mit kommt teilweise gar nicht ans Ziel, meistens 20 Sekunden oder so). Ich hab bei der Konzeption auch null Wert auf Performance gelegt, weil ich eben auch dachte bei so einer Mini-DB wird das schon passen. Wenn ich einfach mal select * from variante sage ist das Ergebnis übrigens sofort da. Das ist der Select:

Code:
select hersteller.name as herstellername, variante.name, variante.url,modell.name as modellname, prozessor.name as prozessor, prozessor.turboboost as turboboost, prozessor.architektur as prozessorarchitektur, prozessor.anzkerne as prozessorkerne, prozessor.taktfrequenz as taktfrequenz, variante.status,variante.lte,
    vga.vorhanden as vgavorhanden, vga.adapter as vgaadapter, vga.minivga, lan.vorhanden as lanvorhanden, lan.geschwindigkeit as langeschwindigkeit, lan.adapter as lanadapter,
    arbeitsspeicher.groesse as arbeitsspeichergroesse, arbeitsspeicher.art as arbeitsspeicherart,grafikkarte.name as grafikkarte,
    gehaeuse.name as gehaeuse, variante.hdd, variante.ssd,    displaygroesse.groesse as displaygroesse,
    displayeigenschaft.eigenschaft as displayeigenschaft, aufloesung.breite as aufloesungbreite, aufloesung.hoehe as aufloesunghoehe,
    betriebssystem.name as betriebssystem, variante.touchscreen, wlan.name as wlan, variante.bluetooth,variante.usb2,
    variante.usb3,variante.thunderbolt,variante.audio, variante.spdif, variante.modem, variante.fingerprint, variante.tpm, variante.docking,
    variante.tastaturbeleuchtung,variante.umts,cardreader.name as cardreader, variante.instanton, webcam.name as webcam, hdmi.vorhanden as hdmivorhanden, hdmi.adapter as hdmiadapter,hdmi.minihdmi,hdmi.microhdmi,hdmi.version as hdmiversion,
    displayport.vorhanden as displayportvorhanden,displayport.adapter as displayportadapter,displayport.minidisplayport, variante.esata, variante.wirelessdisplay,variante.breite,variante.tiefe,variante.hoehe,variante.akkulaufzeit,
    variante.gewicht, dvi.vorhanden as dvivorhanden,dvi.adapter as dviadapter,dvi.minidvi, variante.affiliateamazon,variante.affiliatenotebooksbilliger
    from variante,laufwerk,dvi,displayport,lan, modell,hdmi, hersteller,prozessor,grafikkarte,vga,displaygroesse,displayeigenschaft,aufloesung,betriebssystem,wlan,cardreader, webcam,gehaeuse,arbeitsspeicher
    where variante.hersteller = hersteller.id and variante.modell = modell.id and variante.prozessor = prozessor.id and grafikkarte.id = variante.grafikkarte and variante.displaygroesse = displaygroesse.id
    and variante.displayeigenschaft = displayeigenschaft.id and variante.aufloesung = aufloesung.id and variante.betriebssystem = betriebssystem.id and variante.wlan = wlan.id
    and variante.cardreader = cardreader.id and variante.webcam = webcam.id and variante.gehaeuse = gehaeuse.id and variante.arbeitsspeicher = arbeitsspeicher.id
    and variante.hdmi=hdmi.id and displayport.id = variante.displayport and variante.vga = vga.id and dvi.id = variante.dvi and variante.lan = lan.id and laufwerk.id = variante.laufwerk and variante.modell = 11

Ist natürlich ellenlang, wird auch noch in eine View ausgelagert, aber wie gesagt, bei der view ist es das Selbe...
 

ukulele

Datenbank-Guru
Beiträge
4.579
Lang aber eigentlich simpel. Nur die Anzahl der Tabellen ist enorm, ich weiss auch nicht ob es sinnvoll ist für hdmi, display port etc. Tabellen anzulegen. Was steht denn da drin, gibt es da Mehrfachzuordnungen von hdmi zu varianten oder warum schreibt man die Information nicht einfach in die Varianten-Tabelle?

Trotz alledem sollte die Abfrage laufen und das vor allem auch immer gleich schnell / langsam. Geht während der Abfrage die CPU Last in die höhe? Wie viele Ergebniszeilen werden dir ausgegeben?

Eventuell hilft ein Index, bei der geringen Menge an Daten sollte das aber kein Problem darstellen.
 

gkette

Benutzer
Beiträge
16
ja, da gibt es Mehrfachzuordnungen, z.B. ob es Mini-HDMI ist, ob ein Adapter dabei ist, etc. Daher sind die nötig. Alle true / false stehen in der Tabelle Variante. Die Auslastung eines Kerns geht auf 100%, also scheint der wirklich zu arbeiten. Meistens habe ich 5-10 Zeilen, wenn ich mir die Varianten eines Modells ausgeben lasse.
 

gkette

Benutzer
Beiträge
16
Das wundert mich ja eben auch so. Es sind zwar relativ viele Joins, die meisten gejointen Tabellen haben aber nur 4-5 Werte und alles wird über Index angesprochen...
 

ukulele

Datenbank-Guru
Beiträge
4.579
Kannst du vieleicht mal MySQL auf einer anderen Maschine installieren, nur die Tabellen kopieren und die Abfrage mit PHP MyAdmin testen? Ideen hab ich sonst auch nicht mehr...
 

gkette

Benutzer
Beiträge
16
hab ich gerade mal getestet. Scheint eindeutig ein Problem der DB zu sein. Hab das Ganze mal lokal in XAMPP gestartet. Exakt der selbe Effekt. Ein Kern geht hoch, Abfrage dauert Ewigkeiten. Hat sonst vielleicht noch jemand Ideen? Ich kann auch gerne die Struktur der DB als .sql hochladen, wenn es jemandem was bringt.
 

ukulele

Datenbank-Guru
Beiträge
4.579
Wenn du mir die Tabellen und nur die Einträge als T-SQL Code gibst kann ich das ja mal bei mir testen. Allerdings dann mit MS SQL, daher würde ich wirklich nur die Tabellen ohne Schlüssel oder Index nehmen.
 

gkette

Benutzer
Beiträge
16
würde ich glatt machen, ich weiß aber ehrlich gesagt mit t-sql nichts anzufangen. Hab gerade mal gegoogelt, aber nichts gefunden wie ich das exportieren könnte.
 

gkette

Benutzer
Beiträge
16
ich bin jetzt auch schon ein kleines Stück weiter. Er hängt so lange bei Status "statistics". Muss ich nur nochmal rausfinden was das ist:
 

Anhänge

  • screeni.gif
    screeni.gif
    31,6 KB · Aufrufe: 4

gkette

Benutzer
Beiträge
16
ich hab jetzt nochmal den Select umgeworfen und die Engine auf innodb gewechselt. Immer noch das Selbe mit:
Code:
select v.name
from variante v
join arbeitsspeicher on (arbeitsspeicher.id = v.arbeitsspeicher)
join aufloesung on (aufloesung.id = v.aufloesung)
join betriebssystem on (betriebssystem.id = v.betriebssystem)
join cardreader on (cardreader.id = v.cardreader)
join displayeigenschaft on (displayeigenschaft.id = v.displayeigenschaft)
join displaygroesse on (displaygroesse.id = v.displaygroesse)
join displayport on (displayport.id = v.displayport)
join dvi on (dvi.id = v.dvi)
join gehaeuse on (gehaeuse.id = v.gehaeuse)
join grafikkarte on (grafikkarte.id = v.grafikkarte)
join hdmi on (hdmi.id = v.hdmi)
join hersteller on (hersteller.id = v.hersteller)
join lan on (lan.id = v.lan)
join laufwerk on (laufwerk.id = v.laufwerk)
join modell on (modell.id = v.modell)
join prozessor on (prozessor.id = v.prozessor)
join vga on (vga.id = v.vga)
join webcam on (webcam.id = v.webcam)
join wlan on (wlan.id = v.wlan)
where modell.id = 4

langsam weiß ich nicht weiter...
 

ukulele

Datenbank-Guru
Beiträge
4.579
Wieviele Zeilen spuckt er denn jetzt aus?

Wie verhält sich die Dauer der Abfrage zur Anzahl der Joins? (schreib doch mal die Dauer auf mit 0,5,10,15 und 19 Joins, eigentlich müsste die ja irgendwie exponentiell steigen bei gleicher Menge Daten in allen Tabellen)
 
Werbung:
Oben