Mysql Profis on Board?

Alle Fragen und Ankündigungen zum Forum!
Nachricht
Autor
Benutzeravatar
Flori
Administrator
Beiträge: 1506
Registriert: Di 9. Jun 2009, 10:44
Vespa: ET4+2*GT125+GTS125ie
Land: Deutschland/Bayern
Wohnort: München
Kontaktdaten:

Mysql Profis on Board?

#1 Beitrag von Flori » Fr 16. Nov 2012, 15:15

Gibts hier den ein oder anderen Mysql Profi? :)

Diese Abfrage scheint extrem langsam abzulaufen (>3s)

Code: Alles auswählen

SELECT f.*, t.topic_title, t.topic_id, t.topic_moved_id,
t.topic_last_post_id FROM (phpbb3_forums f) LEFT JOIN phpbb3_topics t ON
(f.forum_last_post_id = t.topic_last_post_id) ORDER BY f.left_id;
gehört nach googelei wohl zu dem Mod "NV advanced last topic titles"
(also die Überschriften der letzten Beiträge in der Forumsübersicht)
Gestern hab ich ansich die letzte Version eingespielt, aber die Verbesserung ist eher gering.

Jemand eine Idee, wie man das weiter optimieren kann?
Schubbi?

Gruß Flo

Benutzeravatar
Zylinderkopf
Beiträge: 758
Registriert: Mi 24. Jun 2009, 17:53
Vespa: Vespa GTS 125
Land: Österreich
Kontaktdaten:

Re: Mysql Profis on Board?

#2 Beitrag von Zylinderkopf » Fr 16. Nov 2012, 15:39

Hi,

sind die spalten forum_last_post_id, topic_last_post_id und left_id indiziert?

Zylinderkopf

Benutzeravatar
Flori
Administrator
Beiträge: 1506
Registriert: Di 9. Jun 2009, 10:44
Vespa: ET4+2*GT125+GTS125ie
Land: Deutschland/Bayern
Wohnort: München
Kontaktdaten:

Re: Mysql Profis on Board?

#3 Beitrag von Flori » Fr 16. Nov 2012, 16:01

Was heißt denn das und wie stell ich das fest?

Benutzeravatar
gmu
Beiträge: 2672
Registriert: Fr 19. Jun 2009, 17:51
Vespa: GTSPXV 550
Land: Deutschland

Re: Mysql Profis on Board?

#4 Beitrag von gmu » Fr 16. Nov 2012, 16:07

Kannst Du die Abfrage bearbeiten?

Dann mach mal das SELECT mit "LIMIT 20".
Da kannst Du die Ergebnismenge auf die ersten 20 Treffer reduzieren.

Code: Alles auswählen

SELECT f.*, t.topic_title, t.topic_id, t.topic_moved_id, t.topic_last_post_id 

FROM (phpbb3_forums f) LEFT JOIN phpbb3_topics t ON (f.forum_last_post_id = t.topic_last_post_id) ORDER BY f.left_id

LIMIT 20;

gmu

Benutzeravatar
gmu
Beiträge: 2672
Registriert: Fr 19. Jun 2009, 17:51
Vespa: GTSPXV 550
Land: Deutschland

Re: Mysql Profis on Board?

#5 Beitrag von gmu » Fr 16. Nov 2012, 16:10

Flori hat geschrieben:Was heißt denn das und wie stell ich das fest?

Code: Alles auswählen

SHOW KEYS FROM <Tabellenname>
Bsp:

Code: Alles auswählen

SHOW KEYS FROM phpbb3_forums;
SHOW KEYS FROM phpbb3_topics;

Benutzeravatar
Zylinderkopf
Beiträge: 758
Registriert: Mi 24. Jun 2009, 17:53
Vespa: Vespa GTS 125
Land: Österreich
Kontaktdaten:

Re: Mysql Profis on Board?

#6 Beitrag von Zylinderkopf » Fr 16. Nov 2012, 16:17

Ein Index ist eine "Vor-Sortierung" und beschleunigt das Abfragen:
http://dev.mysql.com/doc/refman/5.1/de/ ... dexes.html
Einfach erklärt: Man muss nicht jedesmal beim Abfragen sortieren/indizieren, sondern die Sortierung wird einem beim Abspeichern erstellt und bleibt dann erhalten. Manchmal hilft es, den Index neu anzulegen, hier aber eher nicht, tippe ich.
Wenn du das standardmäßige phpbb-Datenbankdesign verwendest, dann ist das aber sicher richtig eingestellt.

Ist deine Abfrage nicht überhaupt etwas umständlich formuliert, wie wäre es etwa so:

Code: Alles auswählen

SELECT f.*, t.topic_title, t.topic_id, t.topic_moved_id,
t.topic_last_post_id FROM f, t WHERE f.forum_last_post_id = t.topic_last_post_id ORDER BY f.left_id;
gmu's "LIMIT 20" ist auch ein heißer Tipp, denn deine Abfrage liefert eine riesige Ergebnismenge.

Zylinderkopf

Benutzeravatar
Flori
Administrator
Beiträge: 1506
Registriert: Di 9. Jun 2009, 10:44
Vespa: ET4+2*GT125+GTS125ie
Land: Deutschland/Bayern
Wohnort: München
Kontaktdaten:

Re: Mysql Profis on Board?

#7 Beitrag von Flori » Fr 16. Nov 2012, 18:07

Ich hab den Mod eigentlich einfach so übernommen,
wie es in der Anleitung steht.
Der obige Skriptauszug ist mir vom Provider mitgeteilt worden, dass
dieser überarbeitet werden sollte.
Ich muss den erstmal finden. :)
Das mit dem Limit hört sich gut an.

Abfragen kann ich bearbeiten, müsste doch in irgendeinem php file stehen, oder?

Die obigen Befehle kann ich z. B. bei mysqldumper ausführen, oder?

Benutzeravatar
Schubidubidu †
Beiträge: 9072
Registriert: Mo 16. Mai 2011, 07:01
Vespa: GTS300 / GT125L
Land: DE
Wohnort: HE / WOB

Re: Mysql Profis on Board?

#8 Beitrag von Schubidubidu † » Fr 16. Nov 2012, 18:23

Einen Index zu erstellen bringt aber nur etwas für Spalten, wo auch Dubletten drin sind, ansonsten wird es eher sogar noch langsamer.

Weiterhin kannst Du mit EXPLAIN SELECT .... die Abfrage auf VORHER -NACHER durchtesten ob das Indexieren etwas gebracht hat.
siehe hier : http://dev.mysql.com/doc/refman/5.1/de/explain.html


Dann habe ich im dem Error Stack des "General Error" etwas von MYSQL 4 gelesen.
Daher würde ich DRINGEND anraten auf MYSQL 5 zu wechseln.
Sollte die Datenbank noch MyISAM-Storages besitzen (denke ich mal) umsetzen auf InnoDB.
siehr z.B. hier: http://www.golem.de/1009/78067.html

Gruß

Nachtrag: LIMIT <Zahl> bringts natürlich in jedem Fall... ob 20 oder 100 oder was auch immer.
Auf jeden Fall ist das LIMIT schon mal ein echter Speichersparer, da das volle Pfund ansonsten von jedermann den Server vollpumpt um es danach vom PHP doch nur auf diese Anzahl zu begrenzen.

Also alles was die Datenbank schon selbst begrenzen kann, sollte sie auch schon tun. Das ich in jedem Falle wirksam.
Ich löse die Probleme anderer Leute,
welche sie ohne mich gar nicht hätten.

Benutzeravatar
Flori
Administrator
Beiträge: 1506
Registriert: Di 9. Jun 2009, 10:44
Vespa: ET4+2*GT125+GTS125ie
Land: Deutschland/Bayern
Wohnort: München
Kontaktdaten:

Re: Mysql Profis on Board?

#9 Beitrag von Flori » Fr 16. Nov 2012, 18:30

Die Datenbank sitzt auf mysql5
nur taucht immer bei Infos (auch updates) mysql4 auf.
Keine Ahnung, wo diese Info steht und ausgegeben wird.
Früher war es mal eine mysql4 Datenbank.

Wie stell ich das auf InnoDB um?
Hat das nicht nachwirkungen, wenn ich mal wieder ein Update machen möchte?

Sorry, wenn ich doof frage, aber ist für mich vieles immer noch Neuland.

Benutzeravatar
Schubidubidu †
Beiträge: 9072
Registriert: Mo 16. Mai 2011, 07:01
Vespa: GTS300 / GT125L
Land: DE
Wohnort: HE / WOB

Re: Mysql Profis on Board?

#10 Beitrag von Schubidubidu † » Fr 16. Nov 2012, 18:42

Erst nochmal das hier:

Code: Alles auswählen

 mysqlcheck --optimize --all-databases 
Dieser Kommandozeilenbefehl optimiert (und repariert) alle InnoDB Tabellen aller laufenden Datenbanken.
Ist ungefähr vergleichbar mit der Defragmentierung von Festplatten.

Am besten regelmäßig (z.B. morgens um 03:33 Uhr) per crontab starten, dann sind die Tabellen immer "fit" für den nächsten Tag.
Ich weiß ja nicht, ob du auf deinem Server dort an diesen Befehl rankommst.
Falls nicht, such ich dir das mal in Form eines PHP-Scripts raus, diese Codeschnipsel liegen überall im Web rum.

Ach so: Im "phpmyadmin" kannst Du da sehen, welche Storage-Typ die Tabellen haben.

Bild
Ich löse die Probleme anderer Leute,
welche sie ohne mich gar nicht hätten.

Benutzeravatar
Flori
Administrator
Beiträge: 1506
Registriert: Di 9. Jun 2009, 10:44
Vespa: ET4+2*GT125+GTS125ie
Land: Deutschland/Bayern
Wohnort: München
Kontaktdaten:

Re: Mysql Profis on Board?

#11 Beitrag von Flori » Fr 16. Nov 2012, 18:48

optimiert oder repariert hab ich über phpadmin schon.
Befehle kann ich damit denke ich auch problemlos ausführen.
Hab noch die MyISAM Tabs.

Gruss Flo

P.S. Draf ich im Betrieb optimieren?

Benutzeravatar
Schubidubidu †
Beiträge: 9072
Registriert: Mo 16. Mai 2011, 07:01
Vespa: GTS300 / GT125L
Land: DE
Wohnort: HE / WOB

Re: Mysql Profis on Board?

#12 Beitrag von Schubidubidu † » Fr 16. Nov 2012, 18:56

Flori hat geschrieben:Hab noch die MyISAM Tabs.
Na dann.... ist doch da noch zu erwartendes Potenzial drin.

Howto: http://dev.mysql.com/doc/refman/5.1/de/ ... nnodb.html

Hinweis:
Ich weiß ja nicht wie dein Ding da ausgestattet ist, aber InnoDB braucht etwas mehr RAM (ich glaube rund 100MB insgesamt).
Normalerweise sollte das aber heutzutage kein Thema sein.
Ohnehin erstmal an einer Demodatenbank testen und nicht auf dem heißen System, aber ich denke das ist ohnehin klar. ;)
Flori hat geschrieben:P.S. Draf ich im Betrieb optimieren?
Ja
Ich löse die Probleme anderer Leute,
welche sie ohne mich gar nicht hätten.

Benutzeravatar
gmu
Beiträge: 2672
Registriert: Fr 19. Jun 2009, 17:51
Vespa: GTSPXV 550
Land: Deutschland

Re: Mysql Profis on Board?

#13 Beitrag von gmu » Fr 16. Nov 2012, 19:22

Prüf doch mal das Plugin oder was das ist, dass die aktuellen Beiträge anzeigt.
Ggf. kann man da bei den Einstellungen ein Limit angeben, dann muß man nicht im PHP rumwursteln.
Aktuell werden hier 1960 Seiten mit jeweils 10 Einträgen angeboten.
Das bedeutet, der MySQL-Server liefert 19.600 Posts komplett (inkl. Postingtext) nur für den einen Block "Aktuelle Beiträge".

@Schubi: Ein Index ist nicht nur für Dubletten.
Den Index braucht man schon um beschleunigt Datensätze zu finden, oder wie in dem SELECT-Statement die zugehörigen verknüpften
Datensätze, die ja über Schlüsselfelder verknüpft (relational) sind.

gmu

Benutzeravatar
Flori
Administrator
Beiträge: 1506
Registriert: Di 9. Jun 2009, 10:44
Vespa: ET4+2*GT125+GTS125ie
Land: Deutschland/Bayern
Wohnort: München
Kontaktdaten:

Re: Mysql Profis on Board?

#14 Beitrag von Flori » Fr 16. Nov 2012, 19:28

Hab ich mal deaktiviert.
Also nur noch 10 Beiträge auf einer Seite.

Benutzeravatar
Schubidubidu †
Beiträge: 9072
Registriert: Mo 16. Mai 2011, 07:01
Vespa: GTS300 / GT125L
Land: DE
Wohnort: HE / WOB

Re: Mysql Profis on Board?

#15 Beitrag von Schubidubidu † » Fr 16. Nov 2012, 19:40

gmu hat geschrieben:@Schubi: Ein Index ist nicht nur für Dubletten.
Den Index braucht man schon um beschleunigt Datensätze zu finden, oder wie in dem SELECT-Statement die zugehörigen verknüpften
Datensätze, die ja über Schlüsselfelder verknüpft (relational) sind.
Schon klar.
"Dubletten" war ein Versuch das möglichst einfach auszudrücken.
Ich meine damit, dass es nur Sinn macht, wenn in Tabellen ohnehin eindeutige Daten stehen (also keine doppelten Einträge), dann muss das RDBMS so oder so voll sequeziell durch, da hilft auch kein Index. Ansonsten würde jedes Datenbank System von Haus aus alles durch"indexen", wenn viel immer viel helfen würde.
Weitere Indexe (außer Primary, Foreign und den Unique Keys) zu platzieren muss schon etwas geplant werden.
Ich höre viel zu oft: "Datenbank langsam, mach'n Index drauf"... so einfach ist das nicht, da schreiben mache sogar Doktorarbeiten drüber.
Aber in der Regel kommt man mit dem oben erwähnten EXPLAIN SELECT... sehr schnell dahinter, ob der gesetzte Index sinnvoll ist.
Falls nicht, wieder ab in die Tonne damit, ist ja kein Problem.

Siehe z.B auch http://phpperformance.de/indizes-richtig-einsetzen/#p8
Ich löse die Probleme anderer Leute,
welche sie ohne mich gar nicht hätten.

Antworten