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

[SQL] PK niet gebruikt in join als tabel niet gespecificeerd

Pagina: 1
Acties:

  • Tjolk
  • Registratie: Juni 2007
  • Laatst online: 17:43
Ik heb de volgende (versimpelde) query:

SQL:
1
2
3
4
5
6
7
8
SELECT 
    [...]
FROM
    data_order_rule
JOIN data_order USING(order_id)
JOIN data_user USING(user_id)
JOIN data_address ON address_id = address_id_shipping
WHERE [...]

Die query duurt vrij lang, dus hop, een EXPLAIN ervoor gezet. Daarbij zie ik dat de primary key address_id (in de tabel data_address) niet gebruikt wordt.

Pas ik de query aan:
SQL:
1
2
3
4
5
6
7
8
SELECT 
    [...]
FROM
    data_order_rule
JOIN data_order USING(order_id)
JOIN data_user USING(user_id)
JOIN data_address ON data_address.address_id = data_order.address_id_shipping
WHERE [...]

Dan wordt mijn query ± 90% sneller en wordt de PK wél gebruikt.

Blijkbaar zit het verschil er dus in dat ik de tabel benoem in mijn ON clause. Nu is mijn probleem an sich dus opgelost, maar ik vraag me hoe dit verschil te verklaren is gezien de werking van MySQL. Immers: data_address is de enige tabel met een kolom address_id en data_order is de enige tabel met een kolom address_id_shipping. (logisch, anders zou de query ook falen).

Wie verlicht mij?

Tjolk is lekker. overal en altijd.


  • dik_voormekaar
  • Registratie: April 2003
  • Laatst online: 22:32
Ik vermoed dat het te maken heeft met het feit dat de tabel data_order zelf ook een gejoinde tabel is. Wellicht blijkt dit uit de twee explain's.
Zou je die kunnen posten?

  • Tjolk
  • Registratie: Juni 2007
  • Laatst online: 17:43
Verrek. Ik doe nu de EXPLAIN voor de eerste query, en krijg nu wel netjes de PK terug als gebruikte key. :S
Sterker nog: de EXPLAINS zijn gewoon gelijk?

Tjolk is lekker. overal en altijd.


  • gekkie
  • Registratie: April 2000
  • Laatst online: 23:29
was je 2e query niet gewoon sneller door een opgewarmde cache oid ?

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Ik denk dat er bijvoobeeld iets mis was met de table statistics waardoor de Query engine dacht dat het zonder PK te gebruiken sneller zou zijn.

De query's zijn met of zonder table-prefix namelijk na verwerken exact gelijk ( Bij een ambigu column definition zou je een fout krijgen immers )

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


  • Tjolk
  • Registratie: Juni 2007
  • Laatst online: 17:43
[b][message=43178105,noline]De query's zijn met of zonder table-prefix namelijk na verwerken exact gelijk ( Bij een ambigu column definition zou je een fout krijgen immers )
Dat was mijn idee ook al inderdaad. Goed, conclusie: niets aan het handje.
Toch bedankt voor het meedenken :)

Tjolk is lekker. overal en altijd.


  • ge-flopt
  • Registratie: Februari 2001
  • Laatst online: 00:48
Mogelijk een oud (lees niet goed) execution plan in het geheugen. En doordat je éénmalig aangeeft hoe de query goed moet lopen dat hij het execution plan aanpast.
Pagina: 1