SELFPHP: Version 5.8.2 Befehlsreferenz - Tutorial – Kochbuch – Forum für PHP Einsteiger und professionelle Entwickler

SELFPHP


Professional CronJob-Service

Suche



CronJob-Service    
bei SELFPHP mit ...



 + minütlichen Aufrufen
 + eigenem Crontab Eintrag
 + unbegrenzten CronJobs
 + Statistiken
 + Beispielaufrufen
 + Control-Bereich

Führen Sie mit den CronJobs von SELFPHP zeitgesteuert Programme auf Ihrem Server aus. Weitere Infos



:: Buchempfehlung ::

Fortgeschrittene CSS-Techniken

Fortgeschrittene CSS-Techniken zur Buchempfehlung
 

:: Anbieterverzeichnis ::

Globale Branchen

Informieren Sie sich über ausgewählte Unternehmen im Anbieterverzeichnis von SELFPHP  

 

:: Newsletter ::

Abonnieren Sie hier den kostenlosen SELFPHP Newsletter!

Vorname: 
Name:
E-Mail:
 
 

Zurück   PHP Forum > SELFPHP > MySQLi/PDO/(MySQL)

MySQLi/PDO/(MySQL) Anfänger, Fortgeschrittene oder Experten können hier Fragen und Probleme rund um MySQLi/PDO/(MySQL) diskutieren

Antwort
 
Themen-Optionen Ansicht
  #1  
Alt 06.04.2010, 12:12:11
oplagon oplagon ist offline
Anfänger
 
Registriert seit: Apr 2010
Alter: 41
Beiträge: 2
Highscore-Ranking-Berechnung: Optimierung möglich?

Guten Tag,

ich arbeite als Software-Entwickler für eine Firma die Spiele herstellt. Nebenbei kümmere ich mich auch nach bestem Wissen und Gewissen um unsere Datenbank (bin leider kein SQL-Profi, aber bisher hats gereicht). In der DB werden u.A. die Highscores unserer Spieler (mehrere Millionen) gespeichert. Und hier wird seit Wochen ein Problem immer deutlicher: Je mehr Spieler wir haben, desto langsamer wird der Zugriff auf die DB d.H. unsere Spieler müssen, wenn sie ihr Highscore-Ranking abfragen wollen, immer länger warten bis sie ihr Ergebnis bekommen.
Mir ist aufgefallen, dass die CPU-Auslastung des Servers durch mySQL teilweise 99% beträgt.
Ich würde hier gerne erfahren, ob das an dem SQL-Query liegt den ich zur Berechnung verwende und ob man diesen noch optimieren kann, oder ob sich unsere Firma einen neuen Server zulegen sollte.
Hier der Query (sortiert wird nach den erreichten Scores - wenn mehrere User den selben Score haben, wird nach Upload-Datum sortiert):

SELECT COUNT(id) rank
FROM 'highscores'
WHERE (score > (
..SELECT score
..FROM 'highscores'
..WHERE name = '$username')
|| (score = (
....SELECT score
....FROM 'highscores'
....WHERE name = '$username')
....&& upload_date < (
....SELECT upload_date
....FROM 'highscores'
....WHERE name = '$username')
..)
);

Hinweis:
Indizes für score & upload_date sind gesetzt!
Tabellenformat ist MyISAM.
Zugriff auf die DB erfolgt über ein PHP-Skript.

Ich hoffe ein versierter SQL-User kann mir einen Rat geben, was ich tun kann, damit unser Server nich ganz in die Knie geht.

Eine Idee wäre, eine weitere Tabelle anzulegen, in der die User bereits ihrem Ranking nach gespeichert sind.
Vorteil: schnelle Abfrage des Rankings eines Users.
Nachteil: wenn ein User sich in seinem Ranking verändert, muss im Worst-Case der Inhalt der komplette Tabelle umsortiert werden.

Vielleicht kann mir auch jemand seine eigene Erfahrung mitteilen, der dieses Idee bereits umgesetzt hat. Ich habe nämlich die Befürchtung, auch wenn deutlich mehr User eine Rankingabfrage machen als ihre Highscores hochzuladen, dass die Zeit, die ein updaten der Tabelle benötigt, mit steigender Userzahl ebenfalls deutlich steigen wird und wir somit nichts von der Umstellung haben.

Bin für jeden Rat dankbar!
Mit Zitat antworten
  #2  
Alt 08.04.2010, 15:54:45
lordcrypto lordcrypto ist offline
Anfänger
 
Registriert seit: Apr 2010
Alter: 36
Beiträge: 3
AW: Highscore-Ranking-Berechnung: Optimierung möglich?

Hi,

Was habt ihr den für einen Server. Kannst mir die Konfiguration (CPU,RAM,Netzwerkanbindung und Betriebssystem) verraten ?
Welche MySQL Version ?
Mit Zitat antworten
  #3  
Alt 08.04.2010, 17:36:41
Lutz Lutz ist offline
Anfänger
 
Registriert seit: Apr 2010
Alter: 51
Beiträge: 3
AW: Highscore-Ranking-Berechnung: Optimierung möglich?

Hallo oplagon,

also wenn mich nicht alles täuscht kann man doch auf alles hinter dem OR verzichten und das sortieren nach Datum dann lieber mittels ORDER BY erledigen!?

Also in etwa so:

SELECT upload_date, COUNT(id) rank
FROM 'highscores'
WHERE score >= (
..SELECT score
..FROM 'highscores'
..WHERE name = '$username')
ORDER BY upload_date ASC;

Ansonsten kann ich keine weiteren Ansätze für Verbesserungen finden ohne mehr über die Serverconfig/daten, und die Tabellen bzw. den Normalisierungsgrad zu Wissen.


Gruß,
Lutz

Geändert von Lutz (08.04.2010 um 17:54:56 Uhr) Grund: date durch upload_date ersetzt
Mit Zitat antworten
  #4  
Alt 09.04.2010, 11:53:45
oplagon oplagon ist offline
Anfänger
 
Registriert seit: Apr 2010
Alter: 41
Beiträge: 2
AW: Highscore-Ranking-Berechnung: Optimierung möglich?

Zitat:
Zitat von Lutz Beitrag anzeigen
Hallo oplagon,

also wenn mich nicht alles täuscht kann man doch auf alles hinter dem OR verzichten und das sortieren nach Datum dann lieber mittels ORDER BY erledigen!?

Also in etwa so:

SELECT upload_date, COUNT(id) rank
FROM 'highscores'
WHERE score >= (
..SELECT score
..FROM 'highscores'
..WHERE name = '$username')
ORDER BY upload_date ASC;

Ansonsten kann ich keine weiteren Ansätze für Verbesserungen finden ohne mehr über die Serverconfig/daten, und die Tabellen bzw. den Normalisierungsgrad zu Wissen.


Gruß,
Lutz
Danke, aber ORDER BY drück richtig auf die Performance. Bei mehr als 2 Millionen Einträgen hat SQL fast 2 Sekunden gebraucht.

Ick hab schon eine gute Lösung gefunden:
Sub-Querys vermeiden / Stringvergleiche reduzieren.

Habs nun so gelöst
Erster Query:
Code:
SELECT score, upload_date
FROM highscores
WHERE name = '$username'
Die Ergenbisse trage ich dann in den zweiten Query ein

Code:
SELECT COUNT(id) rank
FROM highscores
WHERE (score > $score) ||
      (score = $score && upload_date < '$upload_date')
Läuft alles nun bedeutend besser.
Mit Zitat antworten
  #5  
Alt 10.04.2010, 10:35:13
Ckaos Ckaos ist offline
Member
 
Registriert seit: Nov 2007
Beiträge: 843
AW: Highscore-Ranking-Berechnung: Optimierung möglich?

Hi

vielleicht testest du mal meinen Weg der über eine Temporäre Tabelle geht.
Rangliste

Mit einem CRON könntest du alle 1-5min den Spielern den rang auch zuweisen.

mfg

Ckaos
__________________
"Wenn die Leute Häuser so bauen würden, wie wir Programme schreiben, würde der erstbeste Specht unsere Zivilisation zerhacken."
In den allermeisten Fällen sitzt der Bug etwa 40 cm vor dem Monitor!
Mit Zitat antworten
Antwort

Stichworte
highscore, query, ranking


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

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

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

Gehe zu


Alle Zeitangaben in WEZ +2. Es ist jetzt 15:17:30 Uhr.


Powered by vBulletin® Version 3.8.3 (Deutsch)
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.


© 2001-2024 E-Mail SELFPHP OHG, info@selfphp.deImpressumKontakt