[MySQL] Met join selecteren in ON of in WHERE

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • RSD
  • Registratie: Maart 2001
  • Laatst online: 08-02-2017
Ik ben bezig om wat queries op te zetten en nu vroeg ik me opeens het volgende af. Wat is nu beter:

SELECT t1.*,t2.* FROM t1 JOIN t2 ON (t1.id=5 AND t2.xid=t1.xid)

of

SELECT t1.*,t2.* FROM t1 JOIN t2 ON (t2.xid=t1.xid) WHERE t1.id=5

Zit hier een verschil in qua performance of maakt het niks uit. In voorbeelden kom ik vaak de laatste tegen.

Acties:
  • 0 Henk 'm!

  • Pino112
  • Registratie: November 2007
  • Laatst online: 22-09 01:27
De laatste is goed.

Acties:
  • 0 Henk 'm!

Verwijderd

Probeer het. Benchmarken is ook een skill die je als programmeur moet beheersen.

Acties:
  • 0 Henk 'm!

  • RSD
  • Registratie: Maart 2001
  • Laatst online: 08-02-2017
IN het ON gedeelte behoren zeg maar alleen alle restricties die tot t2 behoren, dus zoveel mogelijk t2=. Dat lijkt mij namelijk het meest logische.

Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Onzin; die eerste is ook goed. In dit voorbeeld zal 't weinig uitmaken en bij een RDBMS met een fatsoenlijke queryplanner zal 't meestal ook weinig uitmaken, maar over het algemeen hou ik gewoon aan (al is het maar als "hint" voor de QP) om zo vroeg mogelijk te snoeien in sets. Dat scheelt werk in latere joins e.d. Maar ik ben 't wel eens met Cheatah; gewoon benchen en het executionplan bekijken. Vooral oudere versies van MySQL heb ik op deze manier nog wel eens kunnen "helpen"; ik heb geen idee hoe dat tegenwoordig is. Daarom: meten == weten.

[ Voor 14% gewijzigd door RobIII op 11-03-2012 13:00 ]

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


Acties:
  • 0 Henk 'm!

  • Gomez12
  • Registratie: Maart 2001
  • Laatst online: 17-10-2023
Verwijderd schreef op zondag 11 maart 2012 @ 12:44:
Probeer het. Benchmarken is ook een skill die je als programmeur moet beheersen.
Lees je dan wel even in over benchmarken. Het is een kunst opzich...

Je wilt niet dat query 2 enkel vanuit querycache / FS-cache draait en daardoor het beeld vertekend...

Acties:
  • 0 Henk 'm!

Verwijderd

Als ik het goed begrijp is "JOIN" in mysql een inner join.
Toevallig omdat het een inner join (en t1.id waarschijnlijk uniek is) geven beide queries hetzelfde resultaat. Maar als het een left join was zouden ze een ander resultaat kunnen geven.

Ik zou het meest logische aanhouden: optie 2. De ON-clausule heeft te maken met de link tussen T1 en T2.
WHERE gebruik je om te filteren.


Qua performance is dit exact hetzelfde, query wordt naar hetzelfde statement omgezet (zie het EXPLAIN command):
http://stackoverflow.com/...mysql-inner-join-vs-where

Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Over het algemeen wil je zoals RobIII al zegt je resultset zo snel mogelijk zo beperkt mogelijk hebben, dus waar mogelijk vaak al in de ON-clause. Tegelijkertijd zal het vaak niet uitmaken, zoals waarschijnlijk ook in dit geval omdat je maar een enkele inner join hebt. De query optimizer van MySQL is als het goed is ook slim genoeg om voor beide van deze query's hetzelfde execution plan te fabriceren.

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

Verwijderd

De ON-clause is syntactic sugar. In de praktijk is dit precies hetzelfde als een WHERE.

SELECT t1.*,t2.* FROM t1, t2 WHERE t1.id=5 AND t2.xid=t1.xid

Geeft hetzelfde resultaat in dezelfde tijd.

Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Verwijderd schreef op maandag 12 maart 2012 @ 13:12:
Geeft hetzelfde resultaat in dezelfde tijd.
Daarmee is 't nog geen syntactic sugar. Bij outer joins heeft het verschil tussen een predicate op de ON clause i.t.t. de WHERE clause wel degelijk een verschil. Bij inner joins maakt 't (normaliter) niets uit, maar zoals ik zei: in sommige (al dan niet oude(re)) RDBMS'en kan 't net dat kleine duwtje in de rug van de QP zijn (als in: "hint") om een beter executionplan te genereren. Bij mij heeft 't zoals ik zei, in het verleden weliswaar, wel degelijk verschil gemaakt. Maar dat was nog pre MySQL 5.0 denk ik. Of het nog zo is weet ik niet (vermoed van niet), maar het kan ook geen kwaad wat explicieter te zijn; is 't niet voor de QP danwel voor je collega.

edit:
Ah, ik zie dat je zelf ook al zover was (outer joins verschil); ik had deze post gemist. Verder dan dat is 't niets meer dan een kwestie van voorkeur dunkt me.

[ Voor 27% gewijzigd door RobIII op 12-03-2012 13:42 ]

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


Acties:
  • 0 Henk 'm!

  • whoami
  • Registratie: December 2000
  • Laatst online: 11:48
.miep. meeste is al gezegd.

[ Voor 100% gewijzigd door whoami op 12-03-2012 22:27 ]

https://fgheysels.github.io/

Pagina: 1