Information ausblenden
Willkommen im Forum für alle Datenbanken! Registriere Dich kostenlos und diskutiere über DBs wie Mysql, MariaDB, Oracle, Sql-Server, Postgres, Access uvm

Performanceprobleme bei Mini-Produktdatenbank

Dieses Thema im Forum "MySQL und MariaDB" wurde erstellt von gkette, 10 Juli 2012.

  1. gkette

    gkette Benutzer

    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
     
  2. ukulele

    ukulele Datenbank-Guru

    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.
     
  3. gkette

    gkette Benutzer

    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...
     
  4. ukulele

    ukulele Datenbank-Guru

    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.
     
  5. gkette

    gkette Benutzer

    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.
     
  6. gkette

    gkette Benutzer

    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...
     
  7. ukulele

    ukulele Datenbank-Guru

    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...
     
  8. gkette

    gkette Benutzer

    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.
     
  9. gkette

    gkette Benutzer

    trotzdem vielen Dank für die Mühen ;-)
     
  10. ukulele

    ukulele Datenbank-Guru

    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.
     
  11. gkette

    gkette Benutzer

    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.
     
  12. gkette

    gkette Benutzer

    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:

  13. gkette

    gkette Benutzer

    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...
     
  14. ukulele

    ukulele Datenbank-Guru

    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)
     
  15. gkette

    gkette Benutzer

    werde ich heute nicht mehr schaffen, kommt morgen. Kann mein Problem evtl. was damit zu tun haben:
    http://bugs.mysql.com/bug.php?id=20932
    Ich bin leider nicht ganz fit in SQL, das letzte Mal damit gearbeitet habe ich vor 3-4 Jahren, daher kann ich das nicht ganz nachvollziehen.
     
Die Seite wird geladen...

Diese Seite empfehlen

  1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies.
    Information ausblenden