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

[MySQL] query probleem bij samenvoegen van 2 tabellen

Pagina: 1
Acties:

  • boeykenk
  • Registratie: April 2008
  • Laatst online: 13-08 20:06
Hallo (deze keer in 't Nederlands :) ),

ik heb een probleem met een MySQL query tussen 2 tabellen.
Eerst even schetsen hoe mijn tabellen eruit zien.

table 1: tblrelateds
id | predecessor | successor
1 | item1 | item2
2 | item1 | item3
3 | item4| item 5

table 2: tblitems
id | status | attribuut
item1 | A | 1
item2 | B | 2
item3 | C | 3
item4 | B | 1
item5 | A | 3


Ik zou graag de volgende query hebben:
geef me alle items in status "A" en attribuut "1" die gerelateerd zijn aan de items in status "B" en attribuut "2".
"Gerelateerd" betekent hier:
  • het ene item is de voorganger (predecessor), het andere de opvolger (successor)
  • beide zijn opvolger (successor) van een andere voorganger (predecessor)
Op die manier is de tblrelateds een "one-to-many" relatie.
Om het niet te moeilijk te maken is de diepte van de boom slechts 1.
Dus een opvolger kan zelf geen voorganger zijn in een andere relatie.

Ik heb volgende query geprobeerd:

select rel1.predecessor, tblitems.id, second.id from tblpr
join tblitems as second on second.status='B' and second.attribuut='2'
join tblrelateds as rel1 on
(rel1.predecessor=tblitems.id or rel1.successor=tbitems.id)
join tblrelateds as rel2 on
(rel2.predecessor=second.id or rel2.successor=second.id)
where tblitems.status='A' and tblitems.attribuut='1'
and rel1.predecessor=rel2.predecessor

Als ik deze laat lopen op een database met meer dan 100.000 records duurt dit behoorlijk lang. Zo lang dat ik het proces na iets meer dan een minuut heb afgebroken.
Is mijn query correct? En indien ja, kan dit niet sneller?

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Gebruik je ook indexen?

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


  • AtleX
  • Registratie: Maart 2003
  • Niet online

AtleX

Tyrannosaurus Lex 🦖

Doe eens een EXPLAIN in indien je MySQL 5.0.37 of hoger hebt een profile? Dan kun je wel zien waar het probleem ligt. Waarschijnlijk zijn het inderdaad verkeerde of geen indices zoals RobIII al zegt, want een luizige 100000 records joinen zou normaal gesproken geen minuut mogen duren.

[ Voor 59% gewijzigd door AtleX op 07-04-2008 18:22 ]

Sole survivor of the Chicxulub asteroid impact.


  • boeykenk
  • Registratie: April 2008
  • Laatst online: 13-08 20:06
Ik gebruik inderdaad geen indexen.
Nog nooit mee gewerkt trouwens.
Ik veronderstel dat ik mijn database op die manier zal moeten configureren.
Kan je tips geven hoe dit moet?
Moet ik mijn je code hier ook voor aanpassen? Waarschijnlijk niet.

  • Voutloos
  • Registratie: Januari 2002
  • Niet online
Gezien je vele vragen denk ik dat je beter eerst kan gaan lezen wat indexen uberhaupt zijn. :>

{signature}


  • LuCarD
  • Registratie: Januari 2000
  • Niet online

LuCarD

Certified BUFH

De join met tblpr is niet correct, het is nu een cartesiaans product.

Wat is tblpr eigenlijk?

En ik zou eigenlijk aangeven wat voor een join je wenst. Want wat voor een join krijg je nu eigenlijk ? ( INNER, LEFT, RIGHT, NATURAL LEFT, FULL OUTER?? )

[ Voor 44% gewijzigd door LuCarD op 08-04-2008 09:55 ]

Programmer - an organism that turns coffee into software.


  • boeykenk
  • Registratie: April 2008
  • Laatst online: 13-08 20:06
Oeps sorry. tblpr moet in feite tblitem zijn. Nog een overblijfsel van vroeger. Dus de correcte query zou moeten zijn:

select rel1.predecessor, tblitems.id, second.id from tblitems
join tblitems as second on second.status='B' and second.attribuut='2'
join tblrelateds as rel1 on
(rel1.predecessor=tblitems.id or rel1.successor=tbitems.id)
join tblrelateds as rel2 on
(rel2.predecessor=second.id or rel2.successor=second.id)
where tblitems.status='A' and tblitems.attribuut='1'
and rel1.predecessor=rel2.predecessor

  • AtleX
  • Registratie: Maart 2003
  • Niet online

AtleX

Tyrannosaurus Lex 🦖

Een goede vuistregel is dat je een index plaats op elke kolom die
-in een WHERE gebruikt wordt
-in een ORDER BY gebruikt wordt
-in een GROUP BY gebruikt wordt
-in een join gebruikt wordt.

Probeer dat maar eens. :) Met EXPLAIN kan je zien welke indices (als die er zijn)MySQL gebruikt.

[ Voor 13% gewijzigd door AtleX op 08-04-2008 11:53 ]

Sole survivor of the Chicxulub asteroid impact.


  • boeykenk
  • Registratie: April 2008
  • Laatst online: 13-08 20:06
OK, bedankt voor de info.
Ik zal het op die manier eens proberen.

  • Voutloos
  • Registratie: Januari 2002
  • Niet online
AtleX schreef op dinsdag 08 april 2008 @ 11:49:
Een goede vuistregel is dat je een index plaats op elke kolom die
Om te proberen ja. Maar denk vooral niet dat je voor elke gebruikte kolom een index moet hebben. En soms is enkel een samengestelde index goed genoeg.

{signature}

Pagina: 1