Effizienz von MySQL



  • Hallo Leute,

    ich benutze eine MySQL-DB mit einer Tabelle artikel:
    artikelnr int(255), Primärschlüssel
    beschr text
    lieferant1 int(10)
    lieferant2 int(10)

    In dieser Tabelle sind ca. 100000 Einträge. Die Suche über artikelnr, beschr, lief.1 und lief2 dauert ca. 10 Sek. Wie kann ich das beschleunigen?

    Frohe Weihnachten :xmas1:
    Boris



  • Dazu müsste man mal deine Query sehen. Zudem ist die Frage, ob du die DB auf einem Server hast, der sich nur um die Datenbank kümmern muss, oder ob die Datenbank auf dem Rechner zusammen mit den Benutzerprogrammen läuft.

    Bei mir macht es einen Unterschied mit einem Faktor bis zu 100 ob ich die Datenbankanfrage auf einem Server (266 Mhz, Linux) oder meinem Desktoprechner (2,6 Ghz, WinXP, diverse Programme) laufen lasse. Der schnellere Rechner braucht immer länger...

    Zudem lässt sich die Query evtl. optimieren. Die Frage ist ja, was du unter dieser "Suche" verstehst...

    mfg
    xXx



  • Ich hätte nun an nen INDEX gedacht, aber da gibts keine wirklich nützliche Spalte auf die man einen Index setzen kann. Okay vllt. diese Lieferanten-Spalten aber das kommt mir unpassend vor.

    Vorgestern hab ich mir nochmals die Normalformen angeschaut und da kann ich bei dieser Tabellenstruktur schon sagen, dass diese der ersten oder auch zweiten Normalform widerspricht 🙂

    hier:

    lieferant1 int(10)
    lieferant2 int(10)
    


  • Nehmen wir zum Bsp. einen Query im schlechtesten Fall:
    SELECT * FROM tabelle WHERE artikelnr like '%heinz%' or beschr like '%heinz%' or lieferant1 like '%heinz%' or lieferant2 like '%heinz%' ORDER BY artikelnr;

    freq.9 schrieb:

    Vorgestern hab ich mir nochmals die Normalformen angeschaut und da kann ich bei dieser Tabellenstruktur schon sagen, dass diese der ersten oder auch zweiten Normalform widerspricht 🙂

    hier:

    lieferant1 int(10)
    lieferant2 int(10)
    

    Warum? Wenn Du mehrere Lieferanten hast, lässt sich das doch nicht ändern, oder?



  • Was ist denn, wenn du 3 oder mehr Lieferanten hast? Willst du dann immer deine Tabellenstruktur ändern? Dann hast du aber irgendwann das Problem, dass du für ein Produkt z.B. 6 Lieferanten hast, aber für viele andere nur 1 oder 2. Dann hast du jedesmal 4-5 leere Spalten, die vorhanden sind. Du bekommst durch die Auslagerung der Lieferanten zwar wieder viele Spalten, aber du bekommst eine Abhängigkeit und musst nicht für jedem Produkt wieder neu den Lieferanten angeben.

    Beispiel:
    Du hast 100.000 Datensätze wo 45.746 Datensätze den gleichen Lieferanten haben. Dazu kommt noch, dass dieser Lieferant einmal in lieferant1 und dann wieder einmal lieferant2 genannt wird. Nun kommt es dazu, dass der Lieferant (ein Unternehmen) von einem anderen Unternehmen übernomnmen wird und sich so der Name ändern. Nun musst du diese 45.746 Datensätze durchlaufen und beide Spalten nach dem Lieferanten durchsuchen und diesen ändern. Machst du es jedoch so, dass du jedem Produkt eine ID vergibst und diese ID dann mit der LieferantenID verbindest, so kann du über die IDs eine Verbindung zwischen Produkt und Lieferanten schaffen. Nun musst du lediglich 1 Datensatz ändern, den in dem der Name des Lieferanten (ein Unternehmen) steht.

    Ich hoffe, dass ich dir das ein wenig klar machen konnte.



  • Ok, dass sehe ich ein und macht sicherlich auch Sinn, aber dadurch bekomme ich noch keine Lösung für mein eigentliches Problem.



  • doch Du suchst dann halt zuerst in der Artikel-Tabelle nach Nr und Beschreibung, danach suchst Du anhand der ID des Artikel alle Lieferanten aus der Lieferanten-Tabelle.



  • Diese 10 Sekunden kommen von den massigen Datensätzen. Da kannst du soweit nichts optimieren, ausser die grenzt deine Suche ein wenig ein, setzt vllt. einen geeigneten INDEX etc. Dann sollte deine Abfrage ein wenig schneller laufen.



  • freq.9 schrieb:

    Diese 10 Sekunden kommen von den massigen Datensätzen. Da kannst du soweit nichts optimieren, ausser die grenzt deine Suche ein wenig ein, setzt vllt. einen geeigneten INDEX etc. Dann sollte deine Abfrage ein wenig schneller laufen.

    Das ist ja keine gute Nachricht 😉
    100000 Einträge sind eigentlich ja nicht viele. Was machen denn Unternehmen die mehrere Mill. Einträge haben. Die Programme laufen doch annehmbar schnell.



  • Hi

    Also wenn ich mir die Query so anschaue dann könnte ich mir vorstellen, dass es an den ganzen like Operationen liegt das deine Anfrage so lagne dauert.

    Ist es zwingend erforderlich so viele like Operationen auszuführen?
    Versuche auch es mal mit dem setzen von INDEX, so wie es freq.9 es gesagt hat, dies beschleunigt nochmal die Suche um einiges.

    Bei häufig verwendeten Such Spalten sollte man immer einen Index setzen.

    Guss
    Cotech


Anmelden zum Antworten