Toon posts:

[MySQL] Left join traag?

Pagina: 1
Acties:

Verwijderd

Topicstarter
'Lo,

Ik heb in mijn mysql database 2 tabellen staan. Eentje met nieuwtjes (668 records) en eentje met reacties op de nieuwtjes. Nu wil ik op de beginpagina een headline overzicht met daarnaast het aantal reacties:

code:
1
2
3
4
5
6
SELECT nieuws.id, nieuws.headline, DATE_FORMAT(nieuws.datum, '%d-%m-%Y') AS datum, 
DATE_FORMAT(nieuws.datum, '%H:%i:%s') AS tijd, count(reacties.id) AS aantalReacties 
FROM nieuws LEFT JOIN reacties ON reacties.itemid=nieuws.id 
GROUP BY nieuws.id
ORDER BY nieuws.datum DESC
LIMIT 0,100;


Het probleem is dat dit ontzettend traag is (2 seconde op me eigen bak, en 20 op de server (wat ik helemaal vaag vind)).

Wanneer ik de left join voor een inner join vervang gaat het ontzettend snel, maar dan mis ik dus de nieuwtjes met reacties.

Hoe komt dit? Is MySQL gewoon sloom met left joins (wat op zich natuurlijk al een trage optie is), heeft het te maken met een combinatie van de verschillende functies? En vooral: hoe los ik het op? :)

  • whoami
  • Registratie: December 2000
  • Laatst online: 01:57
Een Left (OUTER) join, is over het algemeen altijd trager dan een gewone (inner) join.

https://fgheysels.github.io/


  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

't Is idd een query die mysql bij mij ook wat minder goed kon, maar 2 seconde is wel erg lang.

Paar puntjes: zit er een index op reacties.itemid, nieuws.id en nieuws.datum ?
Als je een left join doet moet je eigenlijk datgene wat je er aanvast joint rechts zetten:
FROM nieuws LEFT JOIN reacties ON nieuws.id =reacties.itemid

't Maakt voor mysql niet zo uit, maar sommige databases vinden het zo wat fijner en je kan het dan maar beter gelijk goed aanleren :)

Verwijderd

Topicstarter
nu zitten er wel de juiste indexjes op. Gaat om een oude site dus er zitten wel meer n00bfoutjes in. Het gaat nu al een stuk sneller. thanx voor je hulp.

edit: query ook iets geoptimalizeerd met wat hulp van iemand anders:
code:
1
2
3
4
5
6
SELECT nieuws.id, nieuws.headline, nieuws.datum, count(reacties.id) AS aantal_reacties 
FROM nieuws LEFT JOIN reacties ON reacties.itemid=nieuws.id 
WHERE nieuws.datum BETWEEN DATE_SUB(NOW(), INTERVAL 4 MONTH) AND NOW() 
GROUP BY nieuws.id 
ORDER BY nieuws.datum DESC 
LIMIT 0,100


Werkt nu perfect!

[ Voor 57% gewijzigd door Verwijderd op 16-06-2003 16:12 ]