SELECT foto.id, foto.fotonaam, foto.datum, foto.tekst, COUNT(reactie.id) AS reacties, SUM(reactie.punten) AS sterren FROM fotos AS foto LEFT JOIN fotos_reacties AS reactie ON (foto.id = reactie.foto_id) WHERE foto.user_id = '2' GROUP BY foto.id ORDER BY foto.id DESC
Enkel, deze query heeft 1.8 sec nodig om uitgevoerd te worden. Dit lijkt me lang. Kan ik dit optimaliseren?
Een schets van wat ik nodig heb: Tabel fotos:
id, fotonaam, datum, tekst Tabel fotos_reacties:
aantal reacties, en de som van de puntenvelden
Iemand ideeën hoe dit sneller kan ?
Thanks
Edit:
Ter info, zonder de SUM(), duurt de query nog steeds 1.2 seconden... Dus de COUNT() is ook vrij zwaar blijkbaar...
Om eerlijk te zijn lijkt het me dat de Query redelijk in elkaar zit
alleen dit
FROM fotos AS foto LEFT JOIN fotos_reacties AS reactie ON (foto.id = reactie.foto_id) WHERE foto.user_id = '2' GROUP BY foto.id ORDER BY foto.id DESC
(vette gedeelte Lijkt me wat overdreven. Tevens snap ik niet dat je hem eerst hernoemd en dan toch weer fotos_reacties gebruikt)
Ik neem aan dat foto.user_id een int is en dan hoeft hij niet tussen ' '
Je hernoemd hem met de functie AS en later gebruik je toch weer de oorspronkelijke naam:
SELECT
fotos.id,
fotos.fotonaam,
fotos.datum,
fotos.tekst,
COUNT(reactie.id) AS reacties,
SUM(reactie.punten) AS sterren
FROM fotos
LEFT JOIN fotos_reacties ON (fotos.id = reactie.foto_id)
WHERE fotos.user_id = '2' GROUP BY fotos.id ORDER BY fotos.id DESC
Om hier eerlijk op te antwoorden, de group by heb ik verzonnen, en geprobeerd tot het werkte, omdat anders de sum en count niet gingen... Maar ik ga je links eens bekijken... Andere tips blijven nog steeds welkom :)
Edit:
Oké, logisch gezien moet ik dus groepjes maken. Dus dacht ik groepjes te maken op reactie.foto_id, dus dan groepeer ik de velden die hij moet optellen, en het aantal van moet tellen. Deze query geeft identiek dezelfde resultaten, maar doet er 0.1 sec langer over, waardoor de query nog steeds 1.3 sec duurt...
Hmhm.. Daar zeg je wat, verdorie, ik kijk er al 3 dagen gek op, zonder de JOIN kan het in dit geval ook, als ik gewoon de reacties tegelijk wis als de gebruiker zich verwijdert. Daardoor heeft de query nu maar 0.0003 seconden meer nodig! Dankje Roy!
Edit:
Ik heb de join wel nodig... Als er geen reacties op een foto gegeven is, is het de bedoeling dat de foto ook nog wel werkt... Verderzoeken dus :)