[MySQL] Optimieren

Alicexx

Grünschnabel
Hallo,

ich wurde von meinem Hoster aufgefordert meine Datenbanken zu optimieren,
leider fehlt mir dazu die Kenntniss ...

Ich habe die einzelnen Tabellen zwar schon per PHPMyAdmin, mit der Option 'Optimiere Tabelle' beglueckt, aber das reicht anscheinend nicht aus...

Was muss ich also noch tun um die Datenbanken so zu optimieren, dass ich wieder auf einen gruenen Zweig in Punkto Performance zu komme?

Das MySQL 5.1Referenzhandbuch habe ich schon durchgewaelzt, liesst sich fuer mich aber wie Chinesisch-Rueckwaerts :(

Bei den Datenbanken handelt es sich um 5 x Wordpress sowie 5x Ch-Counter ...

Liebe Gruesse
Alice
 
Tja, schwere Frage.
Optimieren heisst wahrscheinlich, dass du sie möglichst klein halten sollst und die Aufrufe darauf möglichst kurz und knapp hälst.

Da du keine selbstgeschriebene Software verwendest, kannst du recht wenig machen. Die Software-Entwickler von Wordpress oder dieser Counter-Software bemühen sich ja schon darum, ihre PHP-Scripte wenig datenbank-lastig zu programmieren.

Vielleicht liegt es einfach nur daran, dass du eventuell zu viele verschiedene Software intsalliert hast. Ich denke ein Hoster geht davon aus, dass ein Nutzer 2 bis maximal 3 verschiedene Software am laufen hat. Wenn du jedoch für 5 verschiedene wordpress-Anwendungen die Datenbanken (womöglich noch mit vielen Beiträgen) füllst, sprengst du den Rahmen.

Mehr kann ich dir nciht dazu sagen. Frag deinen Hoster am besten, was du seines Erachtens tun könntest.

mfg
 
Ich bin leider kein Hellseher aber ich würde vermuten er könnte entweder gemeint haben dass du die Tabellen von der Größe her optimierst (da war dein Optimiere Tabelle schonmal ein guter Ansatz) oder von der Performance.
Wegen Performance würde ich vor allem mal nachsehen ob die primary key Spalten (Primärschlüssel) für jede Tabelle auch als solche gesetzt sind? Fehlen diese Angaben (beispielsweise wegen nem kruden Import) wird es richtig richtig häßlich in Punkto Performance und da würde ich deinen Hoster auch gut verstehen.
Ist alles korrekt ist es wohl so wie mein Vorposter schreibt. Das einzige was du dann noch machen könntest wäre Indizes auf Spalten zu setzen. Aber dazu ist die Kenntniss notwendig welche SQL-Befehle überhaupt abgesetzt werden. Da du die Software nicht geschrieben hast und auch wie du sagst wenig Kentniss besitzt würde ich dir davon abraten.

Ich würde am besten erstmal nachfragen was mit optimieren gemeint ist bevor ich etwas unternehme.
 
Vielen Dank fuer die Antworten ...

Mhh, mein Hoster stellt mit 25 Datenbanken zur Verfuegung, dann gehe dich doch mal davon aus, dass ich die auch komplett nutzen kann oder nicht?

Zur Zeit sind nur 11 Stueck davon in Gebrauch ....

Ich soll die Querys sowie die DB an sich optimieren.
Die Datenbanken hab ich soweit korrekt optimiert, da war mein Weg ueber 'Optimiere Tabelle' wohl richtig.

Mittels EXPLAIN habe ich schon wegen den Indizes geschaut, da wurde mir aber bei possible_keys meist NULL vorgeschlagen, oder eben ein Key der schon vorhanden war, wobei ich aber nicht weiss ob das so korrekt war :confused:

Aber wie soll ich die Querys von WP und dem Counter denn optimieren?
Dazu muesste ich doch in das System eingreifen :suspekt:
 
wechsle am besten deine Counter-Software...Ich hab grade mal den Quelltext durchgeschaut und bin auf so ziemlich heftige Sachen wie solche Queries gestoßen:

PHP:
<?php
$_CHC_VALUES = $_CHC_DB->query(
        'SELECT
                d.besucher_gesamt, d.besucher_heute, d.heute_timestamp, d.besucher_gestern,
                d.`max_online:anzahl`, d.`max_online:timestamp`,
                d.`max_besucher_pro_tag:anzahl`, d.`max_besucher_pro_tag:timestamp`,
                d.`max_seitenaufrufe_pro_tag:anzahl`, d.`max_seitenaufrufe_pro_tag:timestamp`,
                d.seitenaufrufe_gesamt, d.seitenaufrufe_heute, d.seitenaufrufe_gestern,
                d.`durchschnittlich_pro_tag:timestamp`, d.`durchschnittlich_pro_tag:besucher`, d.`durchschnittlich_pro_tag:seitenaufrufe`,
                d.`seitenaufrufe_pro_besucher:besucher`, d.`seitenaufrufe_pro_besucher:seitenaufrufe`,
                d.js_aktiv, d.js_robots, d.js_alle,
                d.timestamp_letztes_db_aufraeumen,
                IF( p.id IS NOT NULL, p.id, -1 ) as diese_seite_id,
                IF( c.nr IS NOT NULL, 1, 0 ) as counted, IF(c.nr IS NOT NULL, c.nr, 0) as besucher_nr, IF(c.seitenaufrufe IS NOT NULL, c.seitenaufrufe, 0) as besucher_seitenaufrufe,
                IF(c.is_robot IS NOT NULL, c.is_robot, -1 ) as is_robot, IF( c.letzte_seite IS NOT NULL, c.letzte_seite, -1 ) as letzte_seite,
                IF( online.id IS NOT NULL, online.id, 0) as online,
                IF(i.tmp_blocked = 0, 1, 0) as ignored_user, IF( i.id IS NOT NULL, i.id, -1 ) as ignored_user_id
        FROM `'. CHC_DATABASE .'`.`'. CHC_TABLE_DATA .'` AS d
        LEFT JOIN `'. CHC_DATABASE .'`.`'. CHC_TABLE_PAGES."` AS p
                ON
                        p.wert =  '".$chC_seite."'
                        AND p.homepage_id = ". $_CHC_CONFIG['aktuelle_homepage_id'] .'
                        AND p.monat = '. $_CHC_VARIABLES['aktueller_monat'] .'
        LEFT JOIN `'. CHC_DATABASE .'`.`'. CHC_TABLE_COUNTED_USERS ."` AS c
                ON
                        ( (c.ip = '". $chC_REMOTE_ADDR ."')
                          OR (c.ip LIKE '". substr( $chC_REMOTE_ADDR, 0, strrpos( $chC_REMOTE_ADDR, '.' ) )."%' AND c.user_agent = '". $_CHC_DB->escape_string( $chC_HTTP_USER_AGENT ) ."')
                        )
                        AND c.timestamp ".
                        ( $_CHC_CONFIG['modus_zaehlsperre'] == 'intervall'
                                ? '>= '. ( CHC_TIMESTAMP - $_CHC_CONFIG['blockzeit'] )
                                :        ' + '
                                        .( ( date( 'I' ) == '1' && $_CHC_CONFIG['dst'] == '0' )
                                                ? date( 'Z') - 3600
                                                : date( 'Z' )
                                        )
                                        .' >= '. $_CHC_VARIABLES['timestamp_tagesanfang']
                        ) .'
        LEFT JOIN `'. CHC_DATABASE .'`.`'. CHC_TABLE_ONLINE_USERS .'` as online
                ON
                        c.nr = online.nr
                        AND online.timestamp_letzter_aufruf >= '. ( CHC_TIMESTAMP - $_CHC_CONFIG['user_online_fuer'] ) .'
        LEFT JOIN `'.CHC_DATABASE .'`.`'. CHC_TABLE_IGNORED_USERS ."` AS i
                ON
                        ( (i.ip = '". $chC_REMOTE_ADDR ."')
                          OR (i.ip LIKE '". substr( $chC_REMOTE_ADDR, 0, strrpos( $chC_REMOTE_ADDR, '.' ) )."%' AND i.user_agent = '". $_CHC_DB->escape_string( $chC_HTTP_USER_AGENT ) ."')
                        )
                        AND i.timestamp ".
                        ( $_CHC_CONFIG['modus_zaehlsperre'] == 'intervall'
                                ? '>= '. ( CHC_TIMESTAMP - $_CHC_CONFIG['blockzeit'] )
                                :        ' + '
                                        .( ( date( 'I' ) == '1' && $_CHC_CONFIG['dst'] == '0' )
                                                ? date( 'Z') - 3600
                                                : date( 'Z' )
                                        )
                                        .' >= '. $_CHC_VARIABLES['timestamp_tagesanfang']
                        ) .';'
);

?>
Ich finde für einen Counter sind das zu komplizierte Datenbank-Anfragen, weil du musst überlegen, dass die bei jedem Seitenaufruf aufgerufen wird.

Und wenn man mal durchzählt, wie viele Datenbank-Anfragen in dem Counter getätigt werden? Ich überfliege und komme auf 15!

Ich würde dir raten, vielleicht eine kleinere (vielleicht auf nicht so umfangreiche) Counter-Software zu nehmen.

Und noch was: Eine Counter-Software mit 1800 Zeilen wirkt sich nicht gut auf die Performance deiner Seite aus!
 
Zuletzt bearbeitet:
Ich mache es auf meiner Seite z.B. so das ich die Daten nichtmehr vom aktuellen Tag anzeigen lasse sondern vom Vortag. Diese Daten werden dann nur 1x am Tag (0 Uhr) berechnet und das Ergebnis in eine andere Tabelle ausgelagert (Crontabs).

So habe ich schon unheimlicht Zeit gespart und alles entlastet. Genauso natürlich mit den Gesamtbesuchern. Ist dann zwar nichtmehr alles 100% aktuell aber schnell ;)

lg
 
Mhh, die Werte des Counters werden nirgends auf den Seiten publik gemacht,
die sind nur mir zugaenglich...

Faellt dass dann trotzdem so arg ins Gewicht?

Liebe Gruesse
Alice
 
Hi Alice,

welche Version von chCounter setzt du denn ein?
Habe mich gerade mal etwas in deren Forum umgesehen und da berichten einige von gleichen Problemen, bzw von Hostern die erstmal die Seite gesperrt haben wegen Datenbanküberlastung:

http://clever-forum.de/read.php?49,123953,123953#msg-123953
weitere lassen sich finden wenn du das Forum nach Performance durchsuchst.

Es macht wahrscheinlich schon einen Unterschied dass du die Statistiken nicht publik machst aber mit zunehmender Größe der Tabelle werden auch deine Inserts langsamer. Wieviele MB haben deine Tabellen denn?

Ich würde chCounter auch ausbauen und stattdessen einen schlankeren Counter einsetzen. Ich kenne die Software nicht aber sieht mir auch ein wenig too much und wenig ressourcenschonend aus. Wenn du ihn behalten willst würde ich uralt Statistiken die du nicht mehr brauchst zumindest löschen um so die Tabellengröße zu reduzieren.
 
Zuletzt bearbeitet:
Hallo Cojote,

Vielen Dank fuer deine Anwort, an das Forum hatte ich gar nicht gedacht...

Die Tabellen eines einzelnen Counters haben es zusammen auf mehr als 2GB gebracht :eek:

Dann werde ich mich wohl noch einem anderen Counter umsehen muessen...

Liebe Gruesse
Alice
 

Neue Beiträge

Zurück