MySQL soweit wie möglich optimieren

  • Hallo zusammen,


    ich habe meinen vServer-Datenbanken gerade einem Leistungstest unterzogen. Soweit so gut. Die Auslastung (im VCP) stieg bis zu 0.79 an.


    Innerhalb von 15 Minuten gab es etwa 250000 Abfragen auf die Datenbank. Diese Anzahl lässt sich nicht verkleinern, sonder sollte falls möglich, auf das 4-Fache ansteigen...
    Den Server will ich in dieser Testphase des Projekts nicht wechseln. Deshalb suche ich Möglichkeiten MySQL soweit wie möglich zu optimieren, um die ideal Performance herauszuholen.


    Die einzigen Auffallenden Werte aus der Status-Ansicht von PHPMyAdmin habe ich angehängt.


    An den Configs von MySQL wurde bisher nicht geschraubt.
    Etwa 90% der Querys sind so aufgebaut:

    SQL
    SELECT url FROM site WHERE url='%s' LIMIT 1

    (Index wurde natürlich gesetzt ;))
    oder

    SQL
    INSERT INTO `site` (`url`, `title`, `author`, `language`, `ownKeyWords`, `otherKeyWords`, `description`) VALUES ('%s', '%s', '%s', '%s', '%s', '%s', '%s');


    Welche Einstellungen würdet ihr anpassen?

  • Naja du musst da erstmal in die Query-Optimierung gehen, so wie es aussieht und danach nochmal die Werte optimieren.
    Solltest du MyIsam nutzen, lässt sich mit Einstellungen nicht viel herausholen, mit InnoDB jedoch schon.


    Aber 250k Querys in 15min kommt mir sehr wenig vor, das sind gerade mal 270QPS

  • Zitat von ice-breaker;17359

    Naja du musst da erstmal in die Query-Optimierung gehen, so wie es aussieht und danach nochmal die Werte optimieren.


    Nunja die einzigen Querys die dabei ausgeführt werden stehen oben. Ich glaube bei denen kann man nicht mehr viel optimieren...


    Zitat von ice-breaker;17359


    Solltest du MyIsam nutzen, lässt sich mit Einstellungen nicht viel herausholen, mit InnoDB jedoch schon.


    Das wäre ein Versuch wert. Doch ich glaube nicht, dass das mein Problem mit der hohen Anzahl an Table-Locks löst...

  • Zitat von Xot;17363

    Nunja die einzigen Querys die dabei ausgeführt werden stehen oben. Ich glaube bei denen kann man nicht mehr viel optimieren...


    glaubst du oder weist du?
    Alleine schon das es ein String-Lookup ist, weiß ich, dass es definitiv schneller geht. ungefähr so:

    SQL
    SELECT url FROM site WHERE hash = CRC32('%s') AND url='%s' LIMIT 1

    CRC32 ist zwar weit weg von einem guten Hash-Algorithmus dafür (mein Favorit wäre FNV-1a) aber sollte seine Arbeit tun. Der Index müsste dfür von der url entfernt werden und auf den Hash gesetzt werden.
    Unter InnoDB könnte man sich noch überlegen den Primary-Key irgendwie zu dieser URL zu machen (als Zahl) denn Primary-Key-Lookups in InnoDB sind höllisch schnell.



    Zitat von Xot;17363

    Das wäre ein Versuch wert. Doch ich glaube nicht, dass das mein Problem mit der hohen Anzahl an Table-Locks löst...


    ka, niemand kann deine Anwendung beurteilen oder kennt irgendwelche Internas, weshalb der Thread "eigentlich" witzlos ist, denn DB-Optimierung klappt nicht aus 100m Sicht auf das System, da muss man ganz tief dran gehen, eigentlich musst du noch mehr Informationen auswerten, als MySQL dir zur Verfügung stellt, EXPLAIN ist nicht ausreichen, mk-query-profiler zB schon.
    Und natürlich viel Wissen und richtiges DB-Design, mit einer Änderung des Schemas bekommst du nicht selten eine Optimierung von 100-1000x der QPS von vorher, mit Query-Optimierung eine ganze Ecke weniger, vllt max 50x soviel

  • Zitat von ice-breaker;17365

    glaubst du oder weist du?


    Ich glaubte zu wissen :D


    Zitat von ice-breaker;17365

    Der Index müsste dfür von der url entfernt werden und auf den Hash gesetzt werden.


    Das werde ich gleich einmal probieren.


    Zitat von ice-breaker;17365

    EXPLAIN ist nicht ausreichen, mk-query-profiler zB schon.


    Der mk-query-profiler sieht ja interessant aus für meine Zwecke. Den werde ich bei Gelegenheit auch ausprobieren.


    Danke erst einmal für deine Hilfe.

  • Du hast verdammtes Glück ;)
    Der Teil den ich meine ist in der Online-Vorschau von Google Books drinne ;)


    High Performance MySQL (2nd Edition) Seite 102: Hash indexes


    ein must-have für jeden, der MySQL optimieren möchte ;)
    Diese Auflage geht richtig tief in den Stoff rein und bringt sehr viele Themen mit, die ich in der 1. Auflage vermisst habe.


    Edit: Ich sehe gerade die Bilder die du noch angehängt hast, unbedingt den Query Profiler einschalten, es scheint so als ob du einige Full-Table-Scans hast. Du wirst also wie schon gesagt Probleme mit deinem Schema und den Querys haben, die MySQL-Einstellungen werden es nicht sein.

  • Oha super :)


    Ich hoffe, diese Optimierungen reichen erst einmal eine Weile ;) Aber das Buch werde ich mir sofort bestellen.


    Danke für deine Hilfe.


    Edit: Für alle die sich auf für dieses Thema interessieren:
    Durch den wechsle zu InnoDB konnte ich meine Query-Anzahl mit dem selben Script fast verdoppeln.