-
27.04.10 09:43 #1
Mitglied Gold
- Registriert seit
- Dec 2008
- Beiträge
- 132
Hallo,
und zwar möchte ich gern eine Art Tabelle aufbauen, die mir sagt, das Datensatz X an 7.Position ist.
Ich habe dafür aktuell folgenden SQL-Befehl:
Durch vergleichen (in PHP) der User-ID kann ich die Abfrage "pausieren", indem ich bei Übereinstimmung der eingeloggten User-ID mit der Ausgabe der SQL-Abfrage ein "break;" einfüge und die Platzierung sozusagen über eine Variable immer um eins addiere.PHP-Code:SELECT count(*) AS Anzahl, user_id FROM list GROUP BY user_id ORDER Anzahl DESC
Die obige DB-Abfrage verbraucht aber viel DB-Last. Kann man das Ganze etwas einfacher stricken?
Auf user_id ist ein Index drauf. Und die Abfrage dauert 1,4 Sekunden.
Und zwar macht jeder User_id einen Eintrag. Umso mehr Einträge, desto eine höhere Position hat er.
Beispiel:
User_id 1 hat 4 Einträge.
User_id 2 hat 5 Einträge.
User_id 3 hat 2 Einträge.
User_id 4 hat 8 Einträge.
Also habe ich insgesamt 19 Datensätze.
Loggt sich User_id 4 ein, muss er da stehen haben, das er die 1.Position inne hat. Für die anderen User_id's eben ihre Positionen. Das mache ich mit der obigen Abfrage, die jedoch viel zu lang dauert.
-
27.04.10 09:58 #2
Du kannst auf das sortierte Query eine Zeilennummer hinzufügen
http://wiki.yaslaw.info/wikka/MySqlRowNum
Das sieht dann etwa so aus
Code sql:1 2 3 4 5 6 7
SELECT @rownum:=@rownum+1 AS rang, statistic.* FROM (SELECT COUNT(user_id) AS anzahl, user_id FROM list GROUP BY userid) AS statistic, (SELECT @rownum:=0) AS vars ORDER BY statistic.anzahl DESC
Für einen einzelnen User sieht dass dan wie folt aus
Code sql:1 2 3 4 5 6 7 8 9 10
SELECT rang FROM (SELECT @rownum:=@rownum+1 AS rang, statistic.* FROM (SELECT COUNT(user_id) AS anzahl, user_id FROM list GROUP BY userid) AS statistic, (SELECT @rownum:=0) AS vars ORDER BY statistic.anzahl DESC) AS DATA WHERE userid = 12
Natürlich ist der ORDER BY immer eine Bremse. Aber ich seh gerade nciht, wei du diesen umgehen oder mit Indexen beschleunigen könntest---------------------------------------------------------------------------------------------------
item: Ich habe es mir aus gesundheitlichen Gründen abgewöhnt unformatierten Code zu lesen (Auch SQL-Statements kann man formatieren!)
item: Tutorial: [PHP][MySQL] Debug Queries
item: Schreibt mir keine PN mit Fragen die im Forum beantwortet werden können - ich mache kein persönliches coaching
item: Bitte zur besseren Lesbarkeit PHP-Code in [PHP]...[/PHP], SQL in [SQL]...[/SQL], Visual Basic in [VB]...[/VB] etc. schreiben
-
27.04.10 10:14 #3
Mitglied Brokat
- Registriert seit
- Apr 2009
- Beiträge
- 311
Du solltest den Index mal angeben, damit er angezogen werden kann.
Code sql:1 2 3 4 5 6 7
SELECT user_id, COUNT(*) AS Anzahl FROM list USE INDEX (idx_foobar) GROUP BY user_id ORDER Anzahl DESC wobei CREATE INDEX idx_foobar ON list (user_id); ist
MySQL ist ein bisserl beschränkt, wenns ums finden des richtigen Index geht. Sollte das nicht fruchten, bleibt Dir immer noch Yaslaws Vorschlag mit den Variablen
Grüße
gore
-
27.04.10 10:16 #4
Das Problem ist, dass der Index zwar bei einer Selection oder einem Sort auf ein Feld oder mehrere Felder was nützt. Jedoch weiss ich nicht, wie nützlich er ist wenn das Feld zuerst mit einer Group-Funktion verarbeitet wird...
---------------------------------------------------------------------------------------------------
item: Ich habe es mir aus gesundheitlichen Gründen abgewöhnt unformatierten Code zu lesen (Auch SQL-Statements kann man formatieren!)
item: Tutorial: [PHP][MySQL] Debug Queries
item: Schreibt mir keine PN mit Fragen die im Forum beantwortet werden können - ich mache kein persönliches coaching
item: Bitte zur besseren Lesbarkeit PHP-Code in [PHP]...[/PHP], SQL in [SQL]...[/SQL], Visual Basic in [VB]...[/VB] etc. schreiben
-
27.04.10 10:30 #5
Mitglied Brokat
- Registriert seit
- Apr 2009
- Beiträge
- 311
Indexbasiertes Group By geht seit MySQL 5. Tricky ist hier, das das Aggregat des GROUP BY gleichzeitig das Sortierkriterium ist.
Wenn so eine Abfrage aber 1,4 sekunden dauert, würde ich mal auf Filesort ohne Index tippen. Dann sollte der indexhint eigentlich schon Performance bringen.
btw, schau doch mal hier :
http://mysqldba.blogspot.com/2008/06...er-by-and.html
Das trifft zwar nur bedingt dieses problem, ich fands aber trotzdem ganz nett.
-
27.04.10 10:34 #6
Mitglied Gold
- Registriert seit
- Dec 2008
- Beiträge
- 132
@yaslwa:
Deine Abfrage dauert nur 0,3 Sekunden. Also Einsparung um ca. 1 Sekunde.Geändert von Schumiel (27.04.10 um 10:40 Uhr)
-
27.04.10 10:45 #7
Mitglied Gold
- Registriert seit
- Dec 2008
- Beiträge
- 132
Nachtrag:
Ich habe den großen Zeitaufwand nun finden können. Ich habe noch eine WHERE-Klausel. Egal, ob ich meine Abfrage nehme oder die von yaslaw.
round hat index mit Kardinalität 3PHP-Code:SELECT count(*) AS Anzahl, user_id FROM list WHERE round = 6 GROUP BY user_id ORDER Anzahl DESC
Sorry, habe die Bedingung voll vergessen.
-
27.04.10 10:45 #8
ggf verwendet er dein Index auf user_id, da ich auch den COUNT() auf die user_id gesetzt habe, braucht er kein anderes Feld aus der Tabelle
Hab grad dein Nachtrag gelesen.
1) Mach einen Index über user_id und round
2) Schreibe die WHERE in eine Unterabfrage
Code sql:1 2 3 4 5 6 7 8 9 10 11 12 13 14
SELECT @rownum:=@rownum+1 AS rang, statistic.* FROM ( SELECT COUNT(user_id) AS anzahl, user_id FROM (SELECT user_id FROM list WHERE round = 6) AS myList GROUP BY userid ) AS statistic, (SELECT @rownum:=0) AS vars ORDER BY statistic.anzahl DESC
Geändert von Yaslaw (27.04.10 um 10:49 Uhr)
---------------------------------------------------------------------------------------------------
item: Ich habe es mir aus gesundheitlichen Gründen abgewöhnt unformatierten Code zu lesen (Auch SQL-Statements kann man formatieren!)
item: Tutorial: [PHP][MySQL] Debug Queries
item: Schreibt mir keine PN mit Fragen die im Forum beantwortet werden können - ich mache kein persönliches coaching
item: Bitte zur besseren Lesbarkeit PHP-Code in [PHP]...[/PHP], SQL in [SQL]...[/SQL], Visual Basic in [VB]...[/VB] etc. schreiben
-
27.04.10 10:54 #9
Mitglied Gold
- Registriert seit
- Dec 2008
- Beiträge
- 132
Hm, deine Abfrage dauert nun 1,6 Sekunden.
-
27.04.10 11:01 #10
Hast du ein Index auf round?
Wie lange dauert das folgende
Code sql:1
SELECT user_id FROM list WHERE round = 6
---------------------------------------------------------------------------------------------------
item: Ich habe es mir aus gesundheitlichen Gründen abgewöhnt unformatierten Code zu lesen (Auch SQL-Statements kann man formatieren!)
item: Tutorial: [PHP][MySQL] Debug Queries
item: Schreibt mir keine PN mit Fragen die im Forum beantwortet werden können - ich mache kein persönliches coaching
item: Bitte zur besseren Lesbarkeit PHP-Code in [PHP]...[/PHP], SQL in [SQL]...[/SQL], Visual Basic in [VB]...[/VB] etc. schreiben
-
27.04.10 11:03 #11
Mitglied Gold
- Registriert seit
- Dec 2008
- Beiträge
- 132
-
27.04.10 11:03 #12
Mitglied Brokat
- Registriert seit
- Apr 2009
- Beiträge
- 311
Bau doch mal folgenden Index aufPHP-Code:SELECT count(*) AS Anzahl, user_id FROM list WHERE round = 6 GROUP BY user_id ORDER Anzahl DESC
CREATE INDEX foobar ON list (round, user_id)
Code sql:1
SELECT user_id, COUNT(*) AS Anzahl FROM list USE INDEX (foobar) WHERE round = 6 GROUP BY user_id ORDER Anzahl DESC
-
27.04.10 11:07 #13
Mitglied Brokat
- Registriert seit
- Apr 2009
- Beiträge
- 311
aso, und poste doch mal nen EXPLAIN
-
27.04.10 11:07 #14
Mitglied Gold
- Registriert seit
- Dec 2008
- Beiträge
- 132
@gorefest:
Leider keine Änderung. Auch immer wieder 1,4 Sekunden, plus/minus kleinere Abweichungen.
-
27.04.10 11:09 #15
Mitglied Gold
- Registriert seit
- Dec 2008
- Beiträge
- 132
EXPLAIN:
[QUOTE=gorefest;1861045]PHP-Code:EXPLAIN SELECT count(*) AS Anzahl, user_id FROM list WHERE round = 6 GROUP BY user_id ORDER Anzahl DESC
Code :1 2
id select_type table type possible_keys key key_len ref rows Extra 1 SIMPLE list ref runde runde 4 const 474140 Using where; Using temporary; Using filesort
Ähnliche Themen
-
Position von div ermitteln
Von deinertsche im Forum Javascript & AjaxAntworten: 3Letzter Beitrag: 29.10.07, 12:17 -
Position vom XML Element ermitteln
Von melmager im Forum JavaAntworten: 1Letzter Beitrag: 29.03.07, 07:46 -
Scroll position im DIV ermitteln
Von Aleyna23 im Forum Javascript & AjaxAntworten: 2Letzter Beitrag: 11.01.07, 09:12 -
Position von CEdit ermitteln und neue Position setzen
Von olliss im Forum VisualStudio & MFCAntworten: 1Letzter Beitrag: 15.09.05, 19:30


7Danke

Zitieren


Login