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
|
:: Anbieterverzeichnis ::
Globale Branchen
Informieren Sie sich über ausgewählte Unternehmen im Anbieterverzeichnis von SELFPHP
:: Newsletter ::
Abonnieren Sie hier den kostenlosen
SELFPHP Newsletter!
|
MySQLi/PDO/(MySQL) Anfänger, Fortgeschrittene oder Experten können hier Fragen und Probleme rund um MySQLi/PDO/(MySQL) diskutieren |
06.04.2010, 12:12:11
|
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!
|
08.04.2010, 15:54:45
|
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 ?
|
08.04.2010, 17:36:41
|
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
|
09.04.2010, 11:53:45
|
Anfänger
|
|
Registriert seit: Apr 2010
Alter: 41
Beiträge: 2
|
|
AW: Highscore-Ranking-Berechnung: Optimierung möglich?
Zitat:
Zitat von Lutz
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.
|
10.04.2010, 10:35:13
|
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!
|
Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
|
|
Themen-Optionen |
|
Ansicht |
Linear-Darstellung
|
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.
HTML-Code ist aus.
|
|
|
Alle Zeitangaben in WEZ +2. Es ist jetzt 15:17:30 Uhr.
|