MySQL Geschwindigkeit LEFT JOIN vs. Kreuzprodukt Frage MySQL Geschwindigkeit LEFT JOIN vs. Kreuzprodukt zu Favoriten hinzufügen

Daumen hoch 1 Daumen runter

Hallo zusammen,

wie kann es sein, dass das Left Join [1] MySQL zum Absturz bringt und das Kreuzprodukt [2] in 0,1s ausgeführt wird? Hab ich was verpasst? HAb ich was vergessen?

 

1------------------------

SELECT c.customers_id FROM customers c LEFT JOIN orders o ON c.customers_id=o.customers_id WHERE NOT c.customers_id='0'

/1-----------------------

 

2------------------------

SELECT c.customers_id FROM customers c, orders o WHERE c.customers_id=o.customers_id AND NOT c.customers_id='0'

/2-----------------------

Antworten


Diese Antwort als GUT bewerten 1 Diese Antwort als SCHLECHT bewerten

Das ON übernimmt auch die Verknüpfung der Spalten beider Tabellen beim JOIN. 

Ist es vielleicht möglich, dass du einen Denkfehler in den Queries hast? [1] + [2] lesen sich so als würdest du alle Kunden haben wollen, die jemals eine Bestellung aufgegeben haben.

In

SELECT 
c.customers_id 
FROM orders o LEFT JOIN customers c 
ON c.customers_id=o.customers_id 
WHERE NOT c.customers_id='0'

ist es doch etwas anders. Du holst dir alle zu den Bestellungen gehörigen ID's und da funktioniert das ON ja auch wie gedacht, oder?

 

"[1] + [2] lesen sich so als würdest du alle Kunden haben wollen, die jemals eine Bestellung aufgegeben haben."

Das ist das Ziel, ja

"ist es doch etwas anders. Du holst dir alle zu den Bestellungen gehörigen ID's und da funktioniert das ON ja auch wie gedacht, oder?"

naja, verwende ich ein JOIN ist das Ergebnis gleich, egal ob so der so rum.

Es liegt wohl aber daran, dass orders keinen Key beim customersid hat, sondern nur beim ordersid

Hier ist ein Klassendiagramm dazu:

https://plus.google.com/112457602357038466754/posts/F8pivqoYUcc

viktord am 05.06.2012

Aaaah, verstehe, das erklärt es.

Tom am 05.06.2012

das erschreckende daran ist, dass dies in der definition von left join nicht "verboten" ist und das Ergebnis aber einen Overflow verursacht, weil das Join keine Referenz findet und alle Inhalte aus c mit allen Inhalten aus c unrreferenziert abzugleichen versucht. Solche Abfragen sollten einen Selbstzerstörungsmechanismus haben, finde ich!

viktord am 05.06.2012

Es sollte in MySQL zumindest so etwas wie eine "Maximum Execution Time" oder so geben, um solche ungewollten Queries zu verhindern.

Tom am 05.06.2012

Aber jetzt weiß ich, dass ich jedes Join erstmal mit Explain mir anzeigen lasse...

viktord am 05.06.2012

Stimmt, damit kann man den Fehler vorab erkennen...

Tom am 05.06.2012
Diese Antwort als GUT bewerten 0 Diese Antwort als SCHLECHT bewerten

So wie es aussieht habe ich das LEFT JOIN wohl doch nicht richtig verstanden. Ich muss die Where Klausel wie folgt erweitern, so dass die Referenz  zustandekommt...

SELECT
c.customers_id
FROM customers c LEFT JOIN orders o
ON c.customers_id=o.customers_id
WHERE
c.customers_id=o.customers_id AND NOT c.customers_id='0'

Ich habe immer gedacht, das würde schon das ON machen

Diese Antwort als GUT bewerten 0 Diese Antwort als SCHLECHT bewerten

Oder ich tausche links und rechts vom Join

SELECT 
c.customers_id 
FROM orders o LEFT JOIN customers c 
ON c.customers_id=o.customers_id 
WHERE NOT c.customers_id='0'
Diese Antwort als GUT bewerten 0 Diese Antwort als SCHLECHT bewerten

----kann weg---

Deine Antwort

Registrierter User Bereits registriert? Bitte logge dich vor dem Antworten ein.

Deine Daten