Portal > Foren > PHP > PHP-Programmierung > performanceprobleme wegen zu großer datenbank?
Antwort
 
Themen-Optionen Thema durchsuchen
Alt 19.06.2006, 23:37 Nach oben    #1
Neuer Benutzer
 
Registriert seit: 19.06.2006
Beiträge: 14
Standard performanceprobleme wegen zu großer datenbank?

Hallo,

ich habe folgendes problem...

ich betreibe eine selbstprogrammierte community, auf dieser erhält jeder angemeldete user ein eigenes userprofil und dazu ein gästebuch welches zur communitkation mit anderen usern dient...

seit einiger zeit tritt es auf, das man sehr lange warten muss bis das gästebuch mit den dazugehörigen einträgen geladen ist...

erklären kann ich es mir nur dadurch, da in der datenbank extrem viele einträge gespeichert sind...
es sind insgesamt 774.673 stück... zahl täglich steigend...

die einträge werden wie folgt gespeicher...

ID
name desjenigen der sich einträgt
name desjenigen an wen der eintrag gerichtet ist
der eintrag selbst

und so werden sie auch ausgelesen... durch die url dann einfach book.php?username=name

demnach werden dann alle einträge ausgelesen wo der inhalt im feld "an" mit dem namen ausgelesen wird, der in der url steht... ich denke das ist bis hier hin verständlich...
außerdem werden die einträge in seiten unterteilt da ja sonst die seite ewig lang wäre, einige haben über 10000 einträge in ihrem gästebuch...
pro seite werden 20 einträge angezeigt...

nunja, scheinbar ist dieses system einfach schlecht durchdacht oder es liegt an etwas anderem... und das ist die frage an euch... wodurch können hier diese extremen performanceprobleme auftreteten?

liegt es an einem vllt. zu schlechten server? derzeit 256 MB RAM... ich wechsle auch auf einen server mit nun 1GB DDR2 RAM... aber auch da kann ja dann bald das problem auftreten wenn noch mehr einträge in der datenbank sind?

ich hoffe ihr könnt mir helfen... wenn ihr der meinung seit, dass vllt. einfach nur das script ziemlich schlecht programmiert sein könnte, wäre ich auch bereit dieses zu posten...

außerdem treten noch größere probleme auf wenn mehr user eingeloggt sind.. demnach werden viel öfter einträge ausgelesen und gespeichert... außerdem wir die book.php dann natürlich dementsprechend auch sehr oft abgerufen...

ich hoffe ihr könnt mir weiterhelfen... ich danke euch schonmal...
*the_rob* ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 19.06.2006, 23:47 Nach oben    #2
Ben
Benjamin Klaile
 
Benutzerbild von Ben
 
Registriert seit: 02.12.2004
Ort: Remagen
Beiträge: 4.512
Standard

Hallo und willkommen im Forum.
Generell wäre es natürlich für dich mal interessant einige Benchmarks durchzuführen und zu schauen, wo die Zeit liegen bleibt.

Wie viele User greifen denn so im Schnitt gleichzeitig auf das Skript zu?
Zeig doch mal die relevanten Stellen (da wo die Zeit liegen bleibt!) hier.
Nutze dazu eventuell:
http://pear.php.net/package/Benchmark

Grüße, Ben.
Ben ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 19.06.2006, 23:50 Nach oben    #3
Neuer Benutzer
 
Registriert seit: 19.06.2006
Beiträge: 14
Standard

Ab 35 usern geht nichts mehr... die seite selbst lädt schnell, das gästebuch nur nicht mehr... bei 40 usern dann stürzt der server ab und die seite ist nicht mehr erreichbar...
*the_rob* ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 19.06.2006, 23:51 Nach oben    #4
Christian Mühlroth
 
Benutzerbild von Chr!s
 
Registriert seit: 04.09.2005
Ort: Nürnberg
Beiträge: 561
Standard

Zitat:
Zeig doch mal die relevanten Stellen (da wo die Zeit liegen bleibt!) hier.
__________________
http://www.ChrisDiary.De
Chr!s ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 19.06.2006, 23:53 Nach oben    #5
Neuer Benutzer
 
Registriert seit: 19.06.2006
Beiträge: 14
Standard

Wie ist das gemeint? Willst du die Adressen (URL's) haben?
Oder die PHP-Scripts...?
*the_rob* ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 19.06.2006, 23:57 Nach oben    #6
Christian Mühlroth
 
Benutzerbild von Chr!s
 
Registriert seit: 04.09.2005
Ort: Nürnberg
Beiträge: 561
Standard

Die Relevanten Zeilen aus deinem PHPCode brauchen wir (mit den MySQLQueries und so) .. Vielleicht lässt sich daraus was schließen ..
__________________
http://www.ChrisDiary.De
Chr!s ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 20.06.2006, 00:01 Nach oben    #7
Neuer Benutzer
 
Registriert seit: 19.06.2006
Beiträge: 14
Standard

Vorab, wirklich ein tolles Forum hier, hier bekommt man sofort Hilfe von hilfsbereiten Leuten... Toll ...

PHP-Code:
<?php
}

$db->query("SELECT * FROM `gbeintraege` WHERE `an`='" addslashes($username) . "' ORDER BY `id` DESC");
$Gesamt=$db->num_rows();

// Seiten //
$per_page=15;

$AnzEntry=$Gesamt;

if (empty(
$page)) $page=1;
$start = ($page*$per_page)-$per_page;
$db->query("SELECT * FROM `gbeintraege` WHERE `an`='" addslashes($username) . "' ORDER BY `id` DESC LIMIT " $start ", " $per_page"");
$pages=ceil(($AnzEntry/$per_page));
$page_links "<center><a href=\"book.php?page=1&username=" base64_encode($username) . "&SID=$SID\" title=\"Erste Seite\"><font class=\"link\">«</font></a> | ";

$page_start=$page-3;
if (
$page 4$page_stop=$page+3;
else 
$page_stop=7;
if (
$page <= 4$page_start=1;
if (
$page > ($pages-3) && $page 4$page_start=$page_start-($page-($pages-3));
if (
$page_start 1$page_start=1;
if (
$page_stop $pages$page_stop=$pages;
for (
$p=$page_start;$p<=$page_stop;$p++) {
    if (
$p==$page$page_links.=" <font class=\"link\">$p</font> | ";
    else 
$page_links.=" <font><a class=\"link\" href=\"book.php?page=$p&username=" base64_encode($username) . "&SID=$SID\">$p</a> | </font>";
}
$page_links.= "<a class=\"link\" href=\"book.php?page=$pages&username=" base64_encode($username) . "&SID=$SID\" title=\"Letzte Seite\"><font class=\"link\">»</font></a></center>";

echo 
$page_links "<br><br>";
// Ende Seiten //

$Gesamt=($Gesamt-$start);
while (
$Eintrag=$db->fetch_assoc()) {

...
ich hoffe das reicht vorerst?

Geändert von Ben (20.06.2006 um 00:55 Uhr)
*the_rob* ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 20.06.2006, 00:04 Nach oben    #8
Christian Mühlroth
 
Benutzerbild von Chr!s
 
Registriert seit: 04.09.2005
Ort: Nürnberg
Beiträge: 561
Standard

Was ich gleich seh, ist SELECT *.
Das ist unnötig.

Warum?
http://www.php-faq.de/q/q-sql-select.html
Das könnte vielleicht sogar deiner Performance helfen.

Ansonsten - indexes in den mySQLDatenbanken richtig gesetzt?
__________________
http://www.ChrisDiary.De
Chr!s ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 20.06.2006, 00:14 Nach oben    #9
Neuer Benutzer
 
Registriert seit: 19.06.2006
Beiträge: 14
Standard

Also ein "SELECT `feldA`, `feldB` FROM ..." wäre in dem falle dann angebrachter?
Okay werde ich sofort abändern...

Das mit diesen indexes wurde mir bereits gesagt, leider kann ich damit nicht wirklich etwas anfangen, was ist damit gemeint?...

Wenn ich folgendes ausgeben lasse: EXPLAIN SELECT * FROM `gbeintraege`
Bekomme ich diese Informationen die mich aber leider nicht wirklich weiterbringen...

*the_rob* ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 20.06.2006, 00:16 Nach oben    #10
Christian Mühlroth
 
Benutzerbild von Chr!s
 
Registriert seit: 04.09.2005
Ort: Nürnberg
Beiträge: 561
Standard

Dann sieh dir das mal an:
http://dev.mysql.com/doc/refman/5.0/en/explain.html
__________________
http://www.ChrisDiary.De
Chr!s ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 20.06.2006, 00:18 Nach oben    #11
Neuer Benutzer
 
Registriert seit: 19.06.2006
Beiträge: 14
Standard

Ähm okay... Aber wie setzte ich nun richtige indexes? ich hab absolut keine Ahnung um ehrlich zu sein... Und was für indexes müsste ich hier setzen?
*the_rob* ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 20.06.2006, 00:21 Nach oben    #12
Christian Mühlroth
 
Benutzerbild von Chr!s
 
Registriert seit: 04.09.2005
Ort: Nürnberg
Beiträge: 561
Standard

Dann eben hier
http://dev.mysql.com/doc/refman/5.0/...l-indexes.html
Les dich doch auch mal ein bisschen selbre durch, du findest genug..
__________________
http://www.ChrisDiary.De
Chr!s ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 20.06.2006, 00:22 Nach oben    #13
Benjamin Steininger
 
Benutzerbild von robo47
 
Registriert seit: 02.06.2005
Ort: weiher im tiefsten Odenwald
Beiträge: 1.203
Standard

wenn du von einem eigenen server redest, lass dir doch mal anzeigen wie stark der speicher beansprucht ist bei 30 usern oder mehr, was belegt den speicher ? mysql oder der webserver ? ...

dazu der punkt, dass sowas:

PHP-Code:
$db->query("SELECT * FROM `gbeintraege` WHERE `an`='" addslashes($username) . "' ORDER BY `id` DESC");
$Gesamt=$db->num_rows(); 
wirklich mist ist ohne ende ... wenn ich die anzahl der einträge will, mach ich:

Code:
select num(*) from table
da muss ich ned zig datensätze unnötig aus der datenbank holen.

und ein ordner in der anfrage ist ja auch total egal

mfg
robo47
robo47 ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 20.06.2006, 00:29 Nach oben    #14
Neuer Benutzer
 
Registriert seit: 19.06.2006
Beiträge: 14
Standard

Das kann ich dir derzeit noch nicht sagen, da ich NOCH über einen ManagedServer verfüge und dort einfach nur FTP zugang habe, also kann ich in dem falle einfach nicht mehr auslesen... bald habe ich dann den deticated server mit SSH zugang und alle dem... dort werde ich sicher dann diese informationen über die linux-konsole auslesen können...
*the_rob* ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 20.06.2006, 00:48 Nach oben    #15
Neuer Benutzer
 
Registriert seit: 19.06.2006
Beiträge: 14
Standard

So vielen Dank nochmal, ich habe die SELECT's nun angepasst... Ob's wirklich schneller ist? Naja ich denke eher nicht... Das lädt immernoch nen ganzes Weilchen... Aber ich werd mir das noch mit den indexes anschauen...
*the_rob* ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 20.06.2006, 01:02 Nach oben    #16
Ben
Benjamin Klaile
 
Benutzerbild von Ben
 
Registriert seit: 02.12.2004
Ort: Remagen
Beiträge: 4.512
Standard

@Chr!s:
Zitat:
Zitat von *the_rob*
die einträge werden wie folgt gespeicher...

ID
name desjenigen der sich einträgt
name desjenigen an wen der eintrag gerichtet ist
der eintrag selbst

und so werden sie auch ausgelesen
Da er sowieso alles aus der Datenbanktabelle ausliest, ist das * schon okay so (sofern nichts Weiteres mehr in der DB steht -).

Zitat:
Zitat von robo47
wenn ich die anzahl der einträge will, mach ich:
Code:
select num(*) from table
Wohl eher COUNT(*).

Grüße, Ben.
Ben ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 20.06.2006, 01:15 Nach oben    #17
Neuer Benutzer
 
Registriert seit: 19.06.2006
Beiträge: 14
Standard

..ähäm ja richtig, ich habe sowieso alle felder ausgelesen...
aber in dem link den ich da sah stand, das man auch wenn man alles ausließt besser kein SELECT * FROM nehmen sollte...

allerdings bin ich, was indexe betrifft immernoch kein stück schlauer was die anwendung dieser betrifft...
wofür sie gut sind und was für vorteile sie haben weiß ich bereits...
allerdings weiß ich zum anderen nichteinmal, welche indexe ich nutzen sollte...

im übrigen hatten sogut wie alle felder den typ TEXT... habe ich inzwischen auch umgeändert in VARCHAR(100) teilweise... usw... aber das brachte mir auch nicht den gewünschen effekt... immernoch lädt das gästebuch total langsam wobei jedoch der rest der page echt verdammt schnell lädt...
scheinbar liegt es wohl in dem sinne dann daran, dass die tabelle für die gästebucheinträge so groß ist und so verdammt viel daten beinhaltet...
aber es muss doch irgend eine möglichkeit geben das ganze schneller zu gestalten... nur fehlen mir dort leider die erforderlichen kenntnisse... wie gesagt...
die community basiert auf teilweise php grundwissen... ich habe mit meiner eigenen community auch php gelernt... wobei ich nun heute weiß, dass es in dem sinne ein fehler war... es funktioniert zwar alles aber ist wohl sehr serverlastig...

ich habe auch ein server monitoring bei meinem derzeitigen hoster...
dort findet man ein diagram welches die auslastung des server anzeigt...

geschrieben steht dort "Der Wert 1 stellt eine 100%ige Auslastung des Servers dar. Sollte sich der Wert permanent über 1 bewegen, sollten sie auf einen "größeren" Server wechseln"
Nunja, der Wert liegt dabei teilweise bei 10 und höher (wenn wirklich viele User eingeloggt sind ... [~ 40 - 50] - Wenn ich den Text wörtlich nehme der dort steht, hat mein Server ja in dem Sinne dann eine Auslastung von 1000% was doch eigentlich gar nicht möglich ist, da 100% sowieso schon eine maximale Auslastung darstellen würde...
*the_rob* ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 20.06.2006, 01:52 Nach oben    #18
me pro ok?
 
Benutzerbild von Lars
 
Registriert seit: 07.09.2005
Ort: Pulheim bei Köln
Beiträge: 964
Standard

Zitat:
Auslastung von 1000% was doch eigentlich gar nicht möglich ist, da 100% sowieso schon eine maximale Auslastung darstellen würde
Bei Shared Servers gibt es meistens ein Soft Limit und ein Hard Limit. Beim Soft Limit wird erstmal nicht wirklich was gemacht, beim Hard Limit aber kriegst du einfach keine weiteren Ressourcen.

Aber nun zu deiner eigentlichen Frage mit den Indizes (ein Idex, zwei Indizes ).
Indizes sagen der Datenbank, dass auf dem Feld, auf dem der Index liegt, häufig Abfragen durchgeführt werden. Hast du zum Beispiel eine Suchfunktion, die folgenden Query benutzt,
sql Code:
  1. SELECT
  2.     `id`
  3. FROM
  4.     `tbl__contents`
  5. WHERE
  6.     `content` LIKE '%suchwort%'
  7. ;
wäre es sinnvoll, einen Index auf die Spalte "content" zu legen, da in dieser permanent gesucht. MySQL sorgt dann dafür (vereinfacht ausgedrückt), dass in dieser Spalte mit dem Index schneller und effizienter gesucht werden kann.

Da in deinem Skript alle Abfragen über "name desjenigen an wen der eintrag gerichtet ist" laufen, ist es, angesichts der großen Anzahl Datensätze, fast schon Pflicht, einen Index auf die Spalte zu legen
__________________
Gedanken aus Draht stricken einen Zaun.

Geändert von Lars (20.06.2006 um 02:02 Uhr)
Lars ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 20.06.2006, 02:02 Nach oben    #19
Neuer Benutzer
 
Registriert seit: 19.06.2006
Beiträge: 14
Standard

Hmm... Aachso, okay vielen lieben Dank, ich verstehe soweit...
Und wie stelle ich das jetzt am besten an? Kannst du mir das vllt. irgendwie erklären oder so?
*the_rob* ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 20.06.2006, 02:06 Nach oben    #20
me pro ok?
 
Benutzerbild von Lars
 
Registriert seit: 07.09.2005
Ort: Pulheim bei Köln
Beiträge: 964
Standard

sql Code:
  1. ALTER TABLE
  2.     `tabelle`
  3. ADD INDEX
  4.     `spalte`
  5. ;
Sollte funktionieren, ansonsten hier schauen


// edit:
1000. Beitrag
__________________
Gedanken aus Draht stricken einen Zaun.
Lars ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Antwort

Lesezeichen


Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
 
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks sind an
PingBacks sind an
RefBacks sind aus

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Entwurfsproblem: Aus Widgets in Datenbank schreiben? Basti PHP-Programmierung 3 29.03.2007 13:13
Problem bei Verarbeitung von Templates (Eigene Klassen) dago PHP-Programmierung 21 31.08.2006 16:02
welche Datenbank - Datentyp für Dateien risa Datenbanken 5 01.12.2005 15:17
Datenbank und Sicherheit sparrow Datenbanken 23 05.11.2005 17:45
Datenbank Verwaltung taskin73 Datenbanken 7 30.07.2005 17:07


Alle Zeitangaben in WEZ +1. Es ist jetzt 18:05 Uhr.


Powered by vBulletin® Version 3.7.4 (Deutsch)
Copyright ©2000 - 2008, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40