2016-08-09 66 views
0

Ich habe zwei Tabellen in meiner MySQL-Datenbank Dienste und Beziehungen, die ich brauche nur zählen, wie viele Dienste in Beziehungen Tisch ist, so versuche ich, wie dieseLEFT JOIN und COUNT zwei Abfragen Unterschied

Meine Tabellen zu tun:

  • Beziehungen - | relation_id | parent_id |
  • Dienstleistungen - | service_id | slug_title | Titel |

Code:

SELECT 
    services.slug_title, 
    services.title, 
    COUNT(relationships.parent_id) AS num_companies 
FROM 
    services 
LEFT JOIN 
    relationships ON services.service_id = relationships.parent_id 
GROUP BY 
    services.service_id 
ORDER BY 
    services.title ASC 

und ich habe eine andere Abfrage

SELECT 
    services.slug_title, 
    services.title, 
    COALESCE(companies, 0) AS num_companies 
FROM 
    services 
LEFT JOIN 
    (SELECT 
     parent_id, COUNT(*) AS companies 
    FROM 
     relationships 
    GROUP BY 
     parent_id) relationships ON services.service_id = relationships.parent_id 
ORDER BY 
    services.title ASC 

Beide Abfragen das gleiche Ergebnis zurück und arbeiten wie ich brauche, aber das ist besser, oder direkt in besser zu nutzen Leistung Weg?

+0

Ich würde mit dem ersten gehen, die Inline-Ansicht zu vermeiden verwendet in der zweiten ("Beziehung") –

+1

Beachten Sie, dass Abfrage 1 eine ungültige GROUP BY hat, die auf neueren MySQL-Versionen nicht ausgeführt wird – jarlh

+0

Können Sie erklären, warum? – SkySonny

Antwort

0

Ich denke, Sie sollten erste Abfrage verwenden. Die Verwendung einer Unterabfrage in der linken Join-Anweisung ist kein Prozessor und Ram-freundliche Dinge, die ich tun kann.

2

Unterabfragen in der FROM-Klausel können die Leistung in MySQL beeinträchtigen, da sie die Verwendung von Indizes verhindern. Das würde eine Präferenz für die erste Version nahelegen.

Allerdings sollten Sie diese Version betrachten:

SELECT s.slug_title, s.title, 
     (SELECT COUNT(*) FROM relationships r WHERE s.service_id = r.parent_id 
     ) AS num_companies 
FROM services s 
ORDER BY s.title ASC; 

Es könnte scheinen kontraintuitiv, dass eine Unterabfrage würde eine bessere Leistung haben. Allerdings kann diese Abfrage Vorteil des Indizes nimmt auf relationships(parent_id) und services(title, parent_id) (oder sogar services(title, service_id, slug_title). Und das nicht die Aggregation auf dem größeren Zwischen JOIN Ergebnis hat zu tun.

soll ich beachten Sie, dass die intellektuell, ziehe ich die erste Version, weil ich denke, es ist die klarste Aussage des Ergebnisses, das Sie wollen. Allerdings ist die korrelierte Unterabfrage auch ziemlich klar und kann eine bessere Leistung haben.

+0

I Ich werde versuchen, Ihre Anfrage zu verwenden, danke für die detaillierte Erklärung. – SkySonny