MYSQL 5 Performance Probleme

baeckerman83

Registered User
Hiho!
Die Zugriffe auf meinen Webserver werden immer mehr. Ich biete eine Statistik App an, diese holt sich die Daten per REST (JSON String) von meinem Webserver. Leider geht kein direkter MYSQL Zugriff.
Nun versuche ich meine Datenbank zu optimieren, da die Zugriffe immer mehr werden. An ruhigen Tagen dauert der Datenbank Zugriff unter 1 sec pro Abfrage. An tagen wo viele User die App nutzen habe ich Zugriffszeiten von mehr als 15sekunden pro Request. Auch wenn ich den Request (call oder select auf eine View) in der Konsole aufrufe habe ich diese Zeiten.
Mit Indexes arbeite ich schon. Habe mit dem mysqltuner auch schon versucht zu optimieren. Aber ich komme jetzt nicht mehr weiter.
1. Ich finde die Joins nicht, die keine Indexes nutzen. Wie kann ich mir diese anzeigen lassen? Ich habe mir per mod_status von apache anzeigen lassen welche Anfragen laufen und mir diese angeschaut, da finde ich keine ohne Indexes in den JOINS.
2. Hilft hier nur noch mehr RAM? Oder kann ich noch etwas optimieren?
Hier meine Server Daten:
Code:
Strato V-PowerServer M (v4.2) - 1 CPU Kern - 2GB Ram garantiert
top - 12:42:45 up 31 days, 18:14,  2 users,  load average: 19.17, 15.36, 14.06
Tasks:  71 total,   3 running,  68 sleeping,   0 stopped,   0 zombie
Cpu(s): 94.5%us,  5.5%sy,  0.0%ni,  0.0%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Mem:   2097152k total,  1033524k used,  1063628k free,        0k buffers
Swap:        0k total,        0k used,        0k free,        0k cached

Hier mal mein mysqltuner.pl Auszug:
Code:
-------- General Statistics --------------------------------------------------
[--] Skipped version check for MySQLTuner script
[OK] Currently running supported MySQL version 5.0.51a-24+lenny5-log
[OK] Operating on 32-bit architecture with less than 2GB RAM

-------- Storage Engine Statistics -------------------------------------------
[--] Status: +Archive -BDB +Federated +InnoDB -ISAM -NDBCluster
[--] Data in MyISAM tables: 42M (Tables: 229)
[--] Data in InnoDB tables: 133M (Tables: 95)
[--] Data in MEMORY tables: 0B (Tables: 1)
[!!] Total fragmented tables: 20

-------- Security Recommendations  -------------------------------------------
[OK] All database users have passwords assigned

-------- Performance Metrics -------------------------------------------------
[--] Up for: 12d 18h 37m 38s (343M q [311.264 qps], 2M conn, TX: 2B, RX: 873M)
[--] Reads / Writes: 48% / 52%
[--] Total buffers: 398.0M global + 7.5M per thread (150 max threads)
[OK] Maximum possible memory usage: 1.5G (74% of installed RAM)
[OK] Slow queries: 0% (1M/343M)
[!!] Highest connection usage: 100%  (151/150)
[OK] Key buffer size / total MyISAM indexes: 60.0M/32.0M
[OK] Key buffer hit rate: 99.5% (4M cached / 25K reads)
[!!] Query cache efficiency: 2.4% (56 cached / 2K selects)
[OK] Query cache prunes per day: 0
[OK] Sorts requiring temporary tables: 0% (0 temp sorts / 1K sorts)
[!!] Joins performed without indexes: 148
[OK] Temporary tables created on disk: 4% (144 on disk / 3K total)
[OK] Thread cache hit rate: 87% (332 created / 2K connections)
[!!] Table cache hit rate: 9% (400 open / 4K opened)
[OK] Open file limit used: 10% (109/1K)
[OK] Table locks acquired immediately: 100% (7K immediate / 7K locks)
[OK] InnoDB data size / buffer pool: 134.0M/256.0M

-------- Recommendations -----------------------------------------------------
General recommendations:
    Run OPTIMIZE TABLE to defragment tables for better performance
    Adjust your join queries to always utilize indexes
    Increase table_cache gradually to avoid file descriptor limits
Variables to adjust:
    query_cache_limit (> 600M, or use smaller result sets)
    join_buffer_size (> 5.0M, or always use indexes with joins)
    table_cache (> 400)
 
1 und 2 habe ich schon gemacht. Da konnte ich auch einiges raus holen. Also bei 2. Dann kamen noch mehr Users. Deinen Punkt 3 werde ich mir mal anschauen und aktivieren.
 
Das nutze ich jetzt auch. Aber es bringt auch nicht richtig viel. Kann mir jemand sagen wie man das "use smaller result sets" umsetzen kann?
Ich habe auch schon festgestellt, wenn ich updates in die DB mache wird sie besonders langsam. Ich mache diese per Prozedur. Nur wie kann ich da die Geschwindigkeit erhöhen oder mir Probleme anzeigen lassen?
Ich nutze Innodb mit Indexe. Evt habe ich da auch zu viele und falsch gesetzt. Kann das sein? Habe hier die Primary Keys und Foreign Keys gesetzt.
 
Ich habe auch schon festgestellt, wenn ich updates in die DB mache wird sie besonders langsam. Ich mache diese per Prozedur. Nur wie kann ich da die Geschwindigkeit erhöhen oder mir Probleme anzeigen lassen?
hast du wirklich mal über deinen Code der Webseite (PHP oder was das dann ist) den Profiler laufen lassen? Da kannst du dann Engpässe ausmachen.

Ich nutze Innodb mit Indexe. Evt habe ich da auch zu viele und falsch gesetzt. Kann das sein? Habe hier die Primary Keys und Foreign Keys gesetzt.
Kann sein, kann nicht sein.
Ja nach Wissen kann mit SQL auch schlecht programmiert sein.
Ich weiß nicht wie z. B. deine Tabellen normalisiert werden oder ob deine Tabellen optimal erstellt werden.
 
Hiho!
Welchen Profiler meinst du? Das ganze sind PHP Scripte die per Crontab gestartet werden und die Daten per XML Abholen und dann in die Datenbank schreiben.
Ja die Datenbank ist in der 3. Normal Form. Das Problem ist aber, dass ich nicht immer den Primary Key als Foreign Key benutzen kann.
 
Ich hab auch eine kleine Seite (et.splatterladder.com) ,wo momentan 2,9k Queries pro Sekunde auflaufen.
Um das alles etwas flüssiger zu gestalten, hab ich das Mysql-Datadir auf eine Ramdisk (ramfs) ausgelagert.
Seither flutschts wunderbar.
 
Um das alles etwas flüssiger zu gestalten, hab ich das Mysql-Datadir auf eine Ramdisk (ramfs) ausgelagert.
Seither flutschts wunderbar.
Bevor jetzt jemand RamFS oder den Ableger TmpFS als Loesung aller Probleme ansieht sollte eventuell erwaehnt werden dass bei einem Stromausfall, Restart oder unmount alle Daten eines solchen Dateisystems auf ewig ins digitale Nirvana sind. Sie sind also nur fuer Read-Only Slaves geeignet aber nicht fuer Master.


Welchen Profiler meinst du? Das ganze sind PHP Scripte die per Crontab gestartet werden und die Daten per XML Abholen und dann in die Datenbank schreiben.
ZB xdebug


Deine Probleme sind schlicht nicht genug RAM, normale Festplatten (SSD's wirken Wunder!) und grosse Antworten auf die Queries.
Solltest du mehr RAM auf der Strasse finden, kannst du auch die Disk-based temporary tables in ein TMPFS umleiten.
Du solltest auch kontrollieren ob die Mysql-Partition mit noatime mount'ed ist.

Wie aber bereits von anderen gesagt kann man nicht ohne deine Skripte und Queries zu kennen magische Optimierungen empfehlen.
 
Hiho!
Sory das ich jetzt erst antworte. Danke für deine Antwort. Ich glaube auch, dass ich um mehr Ram nicht rum komme. Die Datenbank ist jetzt ca 750MB groß und ja InnoDB. Da brauche ich für den Cache ja schon einiges.
Also werde ich mich mal nach mehr Ram umschauen.
 
Back
Top