Hallo,
ich habe hier eine Abfrage, die extrem lange braucht, obwohl sie nach meiner Ansicht gar nicht so komplex ist.
Kurz zur Statistik: Die Tabelle "auctions" hat ca 5 Millionen Einträge, die Tabelle auctions_ratings hat ca. 40Tsd Einträge, die Tabelle users hat ca. 15Tsd Einträge.
Was ich nun haben möchte, sind die Benutzer, die entweder ein bestimmtes Flag gesetzt haben oder bei denen der Wert des Feldes "rating" 100 entspricht. Als Ergebnis der Abfrage möchte ich die userID und die Anzahl der Ratings. Die Abfrage, um das zu realisieren sieht wie folgt aus:
Ausführungsdauer hier sind 0,09 sec - was absolut tragbar ist.
Nun kommt der kritische Punkt: Ich möchte nur die User haben, die einen Eintrag in der Tabelle auctions haben, wobei diese über das Feld auctions.user_id referenziert werden kann.
Ich habe nun zwei Varianten gestetet:
Variante 1)
Ich habe die Tabelle auctions über einen zusätzlichen LEFT JOIN angebunden, wobei mir das das Ergebnis von "bm_count" verfälscht. Diese Abfrage braucht ~140sec.
Variante 2)
Ich habe das Ganze mit einem Subselect umgesetzt:
Wie lange diese Abfrage braucht weiß ich nicht, da ich nach ca.5 minuten abgebrochen habe.
Nun meine Frage: Seht ihr irgendwelche groben Schnitzer oder Performancekiller in der Abfrage? Wenn ja, gibt es Optimierungsmöglichkeiten?
Vielen Dank und schon einmal ein schöne Wochenende!
ich habe hier eine Abfrage, die extrem lange braucht, obwohl sie nach meiner Ansicht gar nicht so komplex ist.
Kurz zur Statistik: Die Tabelle "auctions" hat ca 5 Millionen Einträge, die Tabelle auctions_ratings hat ca. 40Tsd Einträge, die Tabelle users hat ca. 15Tsd Einträge.
Was ich nun haben möchte, sind die Benutzer, die entweder ein bestimmtes Flag gesetzt haben oder bei denen der Wert des Feldes "rating" 100 entspricht. Als Ergebnis der Abfrage möchte ich die userID und die Anzahl der Ratings. Die Abfrage, um das zu realisieren sieht wie folgt aus:
Code:
SELECT u.*, count(r.id) as bw_count FROM `users` u
LEFT JOIN auctions_ratings r ON r.to_id = u.id
WHERE
(u.rating = 100 OR u.flag_trusted = 1)
GROUP BY u.id
ORDER BY bw_count DESC
Nun kommt der kritische Punkt: Ich möchte nur die User haben, die einen Eintrag in der Tabelle auctions haben, wobei diese über das Feld auctions.user_id referenziert werden kann.
Ich habe nun zwei Varianten gestetet:
Variante 1)
Ich habe die Tabelle auctions über einen zusätzlichen LEFT JOIN angebunden, wobei mir das das Ergebnis von "bm_count" verfälscht. Diese Abfrage braucht ~140sec.
Code:
SELECT u.*, count(r.id) as bw_count FROM `users` u
LEFT JOIN auctions_ratings r ON r.to_id = u.id
LEFT JOIN auctions a ON a.user_id = u.id
WHERE
(u.rating = 100 OR u.flag_trusted = 1)
AND
a.date_end > NOW() AND a.root_category_id = 5
GROUP BY u.id
ORDER BY bw_count DESC
Variante 2)
Ich habe das Ganze mit einem Subselect umgesetzt:
Code:
SELECT u.*, count(r.id) as bw_count FROM `users` u
LEFT JOIN auctions_ratings r ON r.to_id = u.id
WHERE
(u.rating = 100 OR u.flag_trusted = 1)
AND
u.id IN (SELECT a.user_id FROM auctions a WHERE
a.date_end > NOW() AND a.root_category_id = 5)
GROUP BY u.id
ORDER BY bw_count DESC
Nun meine Frage: Seht ihr irgendwelche groben Schnitzer oder Performancekiller in der Abfrage? Wenn ja, gibt es Optimierungsmöglichkeiten?
Vielen Dank und schon einmal ein schöne Wochenende!
Zuletzt bearbeitet: