Hi.
Ich habe folgendes Problem:
Die Performance meiner Datenbank lässt sehr zu wünschen übrig da in letzter Zeit der Seitenaufbau sehr langsam geht. Das mit dem Seitenaufbau liegt nicht am Server.
Ich hab mal den Status des Datenbankservers gecheckt und gesehen dass hier einige Werte Rot markiert sind, was natürlich schlecht iss. Beschreibungstext steht ja bei den Mysql datenbanken hinter jedem Wert im Status mit dabei. Folgende Werte sind hier völlig überhöht:
Handler_read_rnd
Handler_read_rnd_next
Ich denke dass die Performance Probleme hiermit zusammen hängen aber ich habe keine Idee wie ich das reduzieren kann. Mit indexen arbeite ich ja, wobei das nich viel Sinn macht da in den Tabellen die am öftesten abgefragt werden meistens auf die bestimmte Anfrage des Users derjenige nicht öfters wie 3mal drin steht.
Weiss jemand Rat?
Serverperformance
gepostet vor 18 Jahre, 7 Monate von pHoEnIx-sTyLe
gepostet vor 18 Jahre, 7 Monate von Macavity
Ausschnitt aus der MySQL-Referenz:
Handler_read_rnd
Anzahl der Anfragen, eine Zeile basierend auf einer festen Position zu lesen. Dieser Wert wird hoch sein, wenn Sie viele Anfragen ausführen, die erfordern, dass das Ergebnis sortiert wird.
Handler_read_rnd_next
Anzahl der Anfragen, die nächste Zeile in der Daten-Datei zu lesen. Dieser Wert wird hoch sein, wenn Sie viele Tabellen-Scans durchführen. Im Allgemeinen weist das darauf hin, dass Ihre Tabellen nicht korrekt indiziert sind, oder dass Ihre Anfragen nicht so geschrieben sind, dass Sie Vorteile aus den Indexen ziehen, die Sie haben.
Stellt sich die Frage, wie sind deine Tabellen aufgebaut und was für Anfragen kommen da so?
Handler_read_rnd
Anzahl der Anfragen, eine Zeile basierend auf einer festen Position zu lesen. Dieser Wert wird hoch sein, wenn Sie viele Anfragen ausführen, die erfordern, dass das Ergebnis sortiert wird.
Handler_read_rnd_next
Anzahl der Anfragen, die nächste Zeile in der Daten-Datei zu lesen. Dieser Wert wird hoch sein, wenn Sie viele Tabellen-Scans durchführen. Im Allgemeinen weist das darauf hin, dass Ihre Tabellen nicht korrekt indiziert sind, oder dass Ihre Anfragen nicht so geschrieben sind, dass Sie Vorteile aus den Indexen ziehen, die Sie haben.
Stellt sich die Frage, wie sind deine Tabellen aufgebaut und was für Anfragen kommen da so?
gepostet vor 18 Jahre, 7 Monate von pHoEnIx-sTyLe
in fast allen tabellen steht der user, x,y -koordinate immer drin. und dann halt noch weitere daten, z.b die einheiten usw.
user,x,y werden fast immer über WHERE ... abgefragt.
ich versteht nich warum handler_read_rnd so hoch iss. es werden kaum abfragen sortiert. un wenn sie sortiert werden dann nur nach dem timestamp.
user,x,y werden fast immer über WHERE ... abgefragt.
ich versteht nich warum handler_read_rnd so hoch iss. es werden kaum abfragen sortiert. un wenn sie sortiert werden dann nur nach dem timestamp.
gepostet vor 18 Jahre, 7 Monate von neit
Hast du die betreffenden Spalten denn indiziert?
gepostet vor 18 Jahre, 7 Monate von pHoEnIx-sTyLe
ja habe ich. aber eine indizierung bringt nich wirklich viel weil kaum mehr als 1 verschiedene datensätze mit dem gleichen user in den meisten tabellen existieren.
zusätzlich ist es so dass manche tabellen nich immer nach den selben kriterien abgefragt werden.
auch die werte dass die tabellen falsch verknüpft wurden sind sehr hoch. anfangs hatte ich aber gar keine joins eingestellt. und die werte waren trotzdem hoch. zudem versteh ich gar nich wie das mit den joins funktionieren soll. muss ich die dann in die select bedingungen mit rein schreiben?
hab einige werte sehr hoch in meinen statistiken und muss das schnellstens beheben.
zusätzlich ist es so dass manche tabellen nich immer nach den selben kriterien abgefragt werden.
auch die werte dass die tabellen falsch verknüpft wurden sind sehr hoch. anfangs hatte ich aber gar keine joins eingestellt. und die werte waren trotzdem hoch. zudem versteh ich gar nich wie das mit den joins funktionieren soll. muss ich die dann in die select bedingungen mit rein schreiben?
hab einige werte sehr hoch in meinen statistiken und muss das schnellstens beheben.
gepostet vor 18 Jahre, 7 Monate von Sarge
Original von pHoEnIx-sTyLe
ja habe ich. aber eine indizierung bringt nich wirklich viel weil kaum mehr als 1 verschiedene datensätze mit dem gleichen user in den meisten tabellen existieren.
Entweder ich verstehe nicht genau was du aussagen willst oder du solltest dir nocheinmal gedanken darüber machen wie ein Index funktioniert
Evtl ein weiterer Grund könnte sein das deine Indezes nicht alle in den Key_buffer passen. Am komfortabelsten nachzuschauen indem du mit mtop zugreifst und oben rechts 2. Zeile den "Cache Hit: " betrachtest. der sollte über 99% liegen. Wenn nicht -> key_buffer_size erhöhen bzw indezes überdenken.
Zu den joins: ein Select x from y, z ist ein vollständiger join (kreuz-join / kartesisches produkt) und ist das performance technisch schlimmste was du machen kannst.. evtl hast du dadruch deine vielen schlechten joins dabei? (auch wenn da kein join als schlüsselwort drin vorkommt )
gepostet vor 18 Jahre, 7 Monate von pHoEnIx-sTyLe
Zum Key_buffer:
Hierzu kann ich leider gar nichts sagen. also das problem iss auch dass ich bei nem webhoster bei dem ich kein zugriff auf die datenbank einstellungen hab weil auf dem datenbankserver noch mehrere user liegen
Zu den Joins:
Hatte mich verschrieben. Hab noch keine joins eingebaut. aber es wird mir trotzdem angezeigt dass ich zu viele joins ohne schlüssel hab.
ich hab eigentlich nur SELECT * FROM.
Hierzu kann ich leider gar nichts sagen. also das problem iss auch dass ich bei nem webhoster bei dem ich kein zugriff auf die datenbank einstellungen hab weil auf dem datenbankserver noch mehrere user liegen
Zu den Joins:
Hatte mich verschrieben. Hab noch keine joins eingebaut. aber es wird mir trotzdem angezeigt dass ich zu viele joins ohne schlüssel hab.
ich hab eigentlich nur SELECT * FROM.
gepostet vor 18 Jahre, 7 Monate von TheUndeadable
Sobald du ein WHERE, ORDER BY oder GROUP BY hast, solltest du auf den betreffenden Spalten einen Index drauf haben.
gepostet vor 18 Jahre, 7 Monate von MrMaxx
Original von TheUndeadable
Sobald du ein WHERE, ORDER BY oder GROUP BY hast, solltest du auf den betreffenden Spalten einen Index drauf haben.
Na ja ... das macht sich aber bei vielen Updates/Inserts nicht gut. Welche Attribute in welcher Kombination und Reihenfolge du indexierst sollte immernoch von der Häufigkeit der passenden Abfragen abhängen.
Zu viele Indexe bedeuten viel Redundanz.
Zu viele Indexe bedeuten auch Zeitverlust bei Inserts und Updates durch viele zusätzliche Operationen.
Deine Aussage hört sich in meinen Ohren ein wenig zu Allumfassend an (vielleicht nicht so allgemein gemeint ?).
Bis denne ...
Maxx
gepostet vor 18 Jahre, 7 Monate von TheUndeadable
Ok, deine Aussage perfektioniert meine... ;-)
gepostet vor 18 Jahre, 7 Monate von noi
Original von pHoEnIx-sTyLe
SELECT * FROM.
benutze nicht * wenn du nicht alle spalten benötigst.
Gruß
gepostet vor 18 Jahre, 7 Monate von pHoEnIx-sTyLe
ja schon. aber meistens brauch ich einige spalten davon.
werd das bei den meisten tabellen auf die reduzieren die ich brauche.
jedoch interessiert mich warum im mysql angegeben wird dass ich joins falsch verwende wenn ich gar keine joins benutze?
werd das bei den meisten tabellen auf die reduzieren die ich brauche.
jedoch interessiert mich warum im mysql angegeben wird dass ich joins falsch verwende wenn ich gar keine joins benutze?
gepostet vor 18 Jahre, 7 Monate von Drezil
ein select from a,b ist auch ein join sofern du von a und b sachen miteinander vergleichst. Und zwar de SCHLECHTESTE art von join, die man sich denken kann
gepostet vor 18 Jahre, 7 Monate von woodworker
Original von noi
Original von pHoEnIx-sTyLe
SELECT * FROM.
benutze nicht * wenn du nicht alle spalten benötigst.
und selbst wenn man alle brauch ist die einzelne angabe der felder die besser lösung
gepostet vor 18 Jahre, 7 Monate von pHoEnIx-sTyLe
Original von Drezil
ein select from a,b ist auch ein join sofern du von a und b sachen miteinander vergleichst. Und zwar de SCHLECHTESTE art von join, die man sich denken kann
Ja aber ich hab nichmal das gemacht. Keine joins drin. und trotzdem kommt die anzeige im mysql.
Ich nutze zur zeit mysql_pconnect. hab das mit beiden möglichkeiten mal versucht. letztendlich hatte ich letztens mit mysql_pconnect eine besser performance.
ist ja auch sinnvoll dass erstmal geprüft wird ob offene verbindungen da sind da es ja einige zugriffe gibt wenn genug online sind.
habt ihr da erfahrungen?