News - Features - Downloads - Forum - Team - Support - Switch View: Screen
Login - Registrierung - Passwort vergessen

Antworten: 53
Seite < 1 2 [3]
VooDooAlex
Thread-Ersteller


Poststar




Herkunft: Coburg
Beiträge: 691
# Antwort: 41 - 02.06.2009 um 23:01 Uhr
Ich will Euch hier nicht vorschreiben wie Ihr Eure Beiträge für CS darstellen sollt. Ich gebe hier lediglich meine Meinung dazu, wie ich denke wie es sein sollte. Und das sehe ich bestimmt nicht alleine so!

Und das:
liefert nunmal die anzahl der beiträge und so wird es bleiben. ich möchte da keine bezugslosen zahlen haben.

hört sich etwas komisch an. So in der Art, dass will ich und so muß es gemacht werden.
Ist das im Sinne Clansphere?

Gruß Alex


------------------




Inaktiv
|
duRiel ClanSphere Team


Weltmeister




Herkunft: Cambridge
Beiträge: 7300
# Antwort: 42 - 02.06.2009 um 23:05 Uhr
klar ist das im sinne von clansphere. sinnvolle vorschläge setzen wir willig um, siehe zum beispiel gerade heute hier. bei weniger sinnvollen sagen wir auch, dass wir das nicht gut finden. sachlich war das doch auch, wo ist das problem..


Inaktiv
|
Gringo00


Beginner





Beiträge: 19
# Antwort: 43 - 02.06.2009 um 23:05 Uhr
02.06.2009 um 22:50 Uhr - duRiel:
na in einem select alle threads zu zählen, alle comments zu zählen, die beiden sachen zu addieren und dann vor allem danach noch zu sortieren ist sehr aufwendig.


Eben deswegen frage ich mich, ob man das unbedingt in einem Select haben muß.

1. Anfrage liefert User + #Comments, (= einmal durch die comments-Tabelle)
2. Anfrage liefert User + #Threads (= einmal durch die Threads-Tabelle)
3. Anfrage liefert User + User-Information (Nick, Active, Delete) (= einmal durch die User-Tabelle)
4. Anfrage liefert Forenränge + entspr. Postingzahl (= einmal durch die Forenränge-Tabelle)

Sprich: Jede Tabelle wird genau einmal angepackt, anstatt sich mit den Joins irgendwelcher Monster aufzubauen. Das müßte ja soweit alle Information sein, die ihr für die Ausgabe benötigt. Das Verknüpfen von (1. + 2.) und 3. und 4. sollte ja in PHP - vermutlich effizienter - möglich sein (samt Sortieren).

Wie gesagt, nur ne Idee - mangels SQL- und PHP-Erfahrung kann ich da leider auch nicht mehr dazu sagen.


Inaktiv
|
duRiel ClanSphere Team


Weltmeister




Herkunft: Cambridge
Beiträge: 7300
# Antwort: 44 - 02.06.2009 um 23:09 Uhr
ist ein berechtigter vorschlag. könnte schneller sein, nur dann ist eben garantiert, dass echt jeder einzelne comment der ganzen webseite, jeder thread, jeder user und jeder forenrang selektiert wird, obwohl man das meiste davon nicht braucht.
bin mir nicht sicher wie mysql das intern macht, aber vermutlich schon auch so in der art..

kann ich mal testen, glaube aber als endgültige lösung kommt wirklich nur das zwischenspeichern der anzahl in frage


Inaktiv
|
VooDooAlex
Thread-Ersteller


Poststar




Herkunft: Coburg
Beiträge: 691
# Antwort: 45 - 02.06.2009 um 23:14 Uhr
02.06.2009 um 23:05 Uhr - duRiel:
klar ist das im sinne von clansphere. sinnvolle vorschläge setzen wir willig um, siehe zum beispiel gerade heute hier. bei weniger sinnvollen sagen wir auch, dass wir das nicht gut finden. sachlich war das doch auch, wo ist das problem..


Dein Post 1 weiter oben ist alles andere als sachlich. Werde jetzt aber nichts mehr hierzu posten, da es Zeitverschwendung ist.

Gruß Alex


------------------




Inaktiv
|
duRiel ClanSphere Team


Weltmeister




Herkunft: Cambridge
Beiträge: 7300
# Antwort: 46 - 02.06.2009 um 23:23 Uhr
*wird per pm geklärt*


Inaktiv
|
Gringo00


Beginner





Beiträge: 19
# Antwort: 47 - 03.06.2009 um 00:43 Uhr
Klar ist Zwischenspeichern schneller, aber eben fehlerbehaftet. Deswegen müßte man ne alternative Lösung mal auf größere Datenbanken loslassen.

Nur noch mal kurz getestet: toplist.php aufgerufen mit debug.php, zeigt als lange dauernde Abfrage:

4.) SELECT usr.users_id AS users_id, usr.users_nick AS users_nick, usr.users_delete AS users_delete, usr.users_active AS users_active, COUNT(DISTINCT cms.comments_id) + COUNT(DISTINCT thr.threads_id) AS comments FROM cs_comments cms LEFT JOIN cs_users usr ON cms.users_id = usr.users_id LEFT JOIN cs_threads thr ON thr.users_id = usr.users_id GROUP BY usr.users_id, usr.users_nick ORDER BY comments DESC, usr.users_nick LIMIT 0,20


Das in PhpMyAdmin eingetippt: die Abfrage dauerte 7.6276 sek.

Nun die vorgeschlagene Variante (nur, daß ich jetzt das Zusammenpacken von 1.-3. in SQL gemacht habe):

SELECT usr.users_id AS users_id, usr.users_nick AS users_nick, usr.users_delete AS users_delete, usr.users_active AS users_active, IFNULL(sub0.comments + sub1.comments, IFNULL(sub0.comments, IFNULL(sub1.comments, 0))) AS comments FROM cs_users usr LEFT JOIN (SELECT cms.users_id, count(cms.users_id) AS comments FROM cs_comments cms GROUP BY cms.users_id ORDER BY comments DESC) AS sub0 ON usr.users_id = sub0.users_id LEFT JOIN (SELECT thr.users_id, count(thr.users_id) AS comments FROM cs_threads thr GROUP BY thr.users_id ORDER BY comments DESC) AS sub1 ON usr.users_id = sub1.users_id ORDER BY comments DESC, usr.users_nick LIMIT 0,20


Das in PhpMyAdmin eingetippt: die Abfrage dauerte 0.0021 sek.

Warum ist das jetzt schneller?
Variante "Original" joint drei Tabellen der Größen #Nutzer, #Threads, #Comments.
Variante "Gringo" joint drei Tabellen der Größen #Nutzer, #Nutzer, #Nutzer.

Die Ergebnisse sind quasi ident (User mit Comments+Threads=0 werden auch noch gelistet, würde man sicher noch wegkriegen). Nun weiß ich nicht, wie es mit der Unterstützung von Subselects in anderen Datenbanken (besonders SQLite) aussieht, aber das ist eben genau die Verknüpfung von Einzelanfragen, die man sicher auch in PHP machen könnte.

Also, falls euch mal langweilig ist, habt ihr jetzt was zu testen...


Inaktiv
|
duRiel ClanSphere Team


Weltmeister




Herkunft: Cambridge
Beiträge: 7300
# Antwort: 48 - 03.06.2009 um 01:09 Uhr
ja, das würde sicherlich nicht mit den anderen dbs gehen. einzige möglichkeit, das ohne das zwischenspeichern zu machen, wird die lösung über das zusammenzählen und sortieren mit php sein.
werde ich testen - sql data würde helfen dabei, hat jemand was parat?


Inaktiv
|
Gringo00


Beginner





Beiträge: 19
# Antwort: 49 - 03.06.2009 um 06:04 Uhr
Mein Versuch im Anhang (erstmal für die Bestenliste).

Ich lauf einmal über die vier Datenbanken, 4x #Nutzer Schleifendurchläufe plus Sortieren von max. 2x #Nutzer Elementen. Eventuell kann man da noch ein paar PHP-Tricks nutzen, aber ich denke, daß zumindest von der Vorgehensweise da nicht mehr machbar ist. (Die Einschränkung auf Board-Comments fehlt, hab leider keiner Zeit mehr gehabt, das noch zu testen.)

Aufbauzeit hat sich damit von 7 auf 0.150 Sekunden reduziert. Ob das bei größeren Datenbanken noch vertretbar schnell läuft, müßte man ausprobieren.
Dateianhänge:
php toplist.php (3.63 KiB - 21 mal heruntergeladen )


Inaktiv
|
hajo ClanSphere Team


VIP - Poster




Herkunft: Barsbüttel
Beiträge: 9411
# Antwort: 50 - 03.06.2009 um 06:08 Uhr
subselects können sqlite und postgresql, sowie ms-sql. soweit mir bekannt ist in mysql der support für diese allerdings erst seit etwa 5.0 vollständig und im manual wird dort noch immer vor geschwindigkeitsproblemen bei komplexen anfragen gewarnt, daher bisher gemieden in csp

allgemein ist mysql vielerorts die bremse und z.b. der grund dafür, dass in csp features wie foreign-keys, trigger, views, pl/sql usw. nirgends verwendet werden. denke mal mit csp 2009.1 wird der support für sqlite v2 und mysql älter als 5.0 gestrichen, wodurch dann zumindest teilweise neues möglich ist


------------------
ClanSphere - professional clan care starts here

Zuletzt editiert von hajo ClanSphere Team am 03.06.2009 um 06:28 Uhr (2x Editiert)
Inaktiv
|
VooDooAlex
Thread-Ersteller


Poststar




Herkunft: Coburg
Beiträge: 691
# Antwort: 51 - 15.07.2009 um 21:36 Uhr
Mein Provider hat mich heute angeschrieben, er schrieb folgendes:
auf Ihrem VPS wird regelmäßig die folgende Query ausgeführt, die zu einer starken Belastung des Plattensystems führt:

Datenbank xxx:

SELECT usr.users_id AS users_id, usr.users_nick AS users_nick, usr.users_delete AS users_delete, usr.users_active AS users_active, COUNT(DISTINCT cms.comments_id) + COUNT(DISTINCT thr.threads_id) AS comments FROM cs_comments cms LEFT JOIN cs_users usr ON cms.users_id = usr.users_id LEFT JOIN cs_threads thr ON thr.users_id = usr.users_id GROUP BY usr.users_id, usr.users_nick ORDER BY comments DESC, usr.users_nick LIMIT 0,20;

Bitte überarbeiten Sie diese Anfrage oder schalten Sie sie ab, damit ein reibungsloser Betrieb des Servers sichergestellt werden kann.


Das von Gringo00 funktiuniert noch nicht ganz so. Die lade Zeit ist schon bedeutend schneller, es werden aber nicht alle userposts aufgezählt.

Hat jemand noch eine Lösung?
Wäre schade wenn ich die Stats abschalten muß.

Gruß Alex


------------------




Inaktiv
|
hajo ClanSphere Team


VIP - Poster




Herkunft: Barsbüttel
Beiträge: 9411
# Antwort: 52 - 15.07.2009 um 22:13 Uhr
ich werde mal schauen, ob für 2009.0.3 zusammen mit dem update system ein fix für diese problematik machbar ist, kann aber noch etwas dauern


------------------
ClanSphere - professional clan care starts here

Inaktiv
|
VooDooAlex
Thread-Ersteller


Poststar




Herkunft: Coburg
Beiträge: 691
# Antwort: 53 - 15.07.2009 um 22:56 Uhr
Vielen dank schonmal, macht nichts wenn es noch ein bischen dauert.

Gruß Alex


------------------




Inaktiv
|
Antworten: 53
Seite < 1 2 [3]


Sie müssen sich registrieren, um zu antworten.


ClanSphere Project - Mailus - Imprint - Disclaimer - Scriptinfo