Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien

[mySQL] Trage query door LEFT JOIN

Pagina: 1
Acties:

  • RickvanHaas
  • Registratie: Oktober 2004
  • Laatst online: 15-05-2024
Ik heb een weblogservice, met als belangrijkste tabellen berichten en users. Nu wil ik op de homepage de 5 nieuwste berichten tonen, maar alleen berichten opnemen waarvan de user toestaat dat zijn bericht getoond wordt. Die optie is vastgelegd in de users-tabel.

Ik gebruik de volgende query:
code:
1
2
3
4
5
6
7
8
9
10
"SELECT 
berichten.id,
berichten.title,
berichten.country_id,
sites.site_name 
FROM berichten
LEFT JOIN sites ON berichten.user_id = sites.user_id 
WHERE
sites.show_homepage = '1' 
ORDER BY berichten.id DESC LIMIT 0,5"


De query doet wat ie moet doen maar is waanzinnig traag en vertraagd zo de hele site. Ik zie niet direct een manier om hem sneller te maken. Iemand suggesties? Mijn dank is groot

Verwijderd

Mijn kristallen bol wil weten:
- tabel structuren(vooral indexes).
- hoeveelheid records in beide tabellen.
- zet eens "EXPLAIN" voor je query en post de resultaten.

  • Cloud
  • Registratie: November 2001
  • Laatst online: 03-11 10:25

Cloud

FP ProMod

Ex-moderatie mobster

De query ziet er op zich goed uit.

Hoe traag is waanzinnig traag? En hoe groot (aantal records) zijn beide tabellen berichten en sites? :) Heb je ook indices en zo ja welke waarop? Hoe is verder de tabelstructuur?

Never attribute to malice that which can be adequately explained by stupidity. - Robert J. Hanlon
60% of the time, it works all the time. - Brian Fantana


  • RickvanHaas
  • Registratie: Oktober 2004
  • Laatst online: 15-05-2024
De snelheid is erg wisselend, maar kan oplopen tot 30 seconden. Niet echt de bedoeling dus.

users bevat zo'n 1000 records, berichten bevat 10.000 berichten. Niet heel schokkend dus.

Beide tabellen hebben geen indexen voor zover ik weet. De Explain geeft:

id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE berichten ALL NULL NULL NULL NULL 10135 Using temporary; Using filesort
1 SIMPLE sites ALL NULL NULL NULL NULL 1038 Using where

  • Cloud
  • Registratie: November 2001
  • Laatst online: 03-11 10:25

Cloud

FP ProMod

Ex-moderatie mobster

RickvanHaas schreef op donderdag 10 april 2008 @ 15:47:
Beide tabellen hebben geen indexen voor zover ik weet.
Begin daar dan maar eens mee :) Indices.

offtopic:
Overigens heb je het steeds over de tabel users maar die zie ik niet terug in je query. Bedoel je niet per ongeluk sites?

[ Voor 10% gewijzigd door Cloud op 10-04-2008 15:51 ]

Never attribute to malice that which can be adequately explained by stupidity. - Robert J. Hanlon
60% of the time, it works all the time. - Brian Fantana


  • frickY
  • Registratie: Juli 2001
  • Laatst online: 18-11 14:08
Ik zou van de LEFT JOIN een INNER JOIN maken, en die WHERE-clause naar je JOIN-conditie verplaatsen. Vervolgens een gecombineerde index op de kolommen user_id + show_homepage in je sites tabel, en het zou moeten werken
SQL:
1
2
3
4
5
6
7
8
SELECT 
   berichten.id, berichten.title, berichten.country_id, sites.site_name 
FROM berichten
INNER JOIN sites ON 
   sites.user_id = berichten.user_id AND 
   sites.show_homepage = 1 
ORDER BY berichten.id DESC 
LIMIT 5


//Edit
Je zou op zijn minst 3 indexen moeten hebben
Primarykeys op berichten.berichten.id en sites.sites.id
Gecombineerde index op sites.user_id en sites.show_homepage

[ Voor 18% gewijzigd door frickY op 10-04-2008 16:03 ]


  • RickvanHaas
  • Registratie: Oktober 2004
  • Laatst online: 15-05-2024
Bedankt voor de feedback. berichten.id en users.id zijn al primary keys, ik zal me verder even inlezen in de gecombineerde indices.

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 19:37
Bekijk (en post ;)) bij performance problemen ook altijd de uitkomst van "EXPLAIN SELECT .. <rest van query> .."; dat geeft al veel informatie over welke indices in overweging genomen worden.
Pagina: 1