Frage

Ich habe Probleme, eine abgeleitete Tabelle in MySQL zu verwenden. Verlangsamt die Verwendung einer abgeleiteten Tabelle die Verarbeitung einer Abfrage von Natur aus?

Hier ist die Frage, die ich versuche zu rennen. Es wird nicht ausgeführt und nur ausfällt.

Es gelingt. Wirklich, ich habe das Problem bis zum letzten Join isoliert. Wenn ich die letzte Verbindung herausnehme, funktioniert es gut. Aber wenn ich den letzten Join zurück hinzufüge, weigert sich, auszuführen.

SELECT cr.COMMUNICATIONS_ID AS ANSWER_ID, 
       cr.CONSUMER_ID as VIEWER_ID, 
       cr.ACTION_LOG_ID, 
       nc.PARENT_COMMUNICATIONS_ID AS QUESTION_ID, 
       nc.SENDER_CONSUMER_ID AS REPLIER_ID, 
       ces.EXPERT_SCORE AS REPLIER_EXPERTISE, 
       cim.CONSUMER_INTEREST_EXPERT_ID AS DOMAIN
    FROM (SELECT 234 AS CONSUMER_ID, 
    ACTION_LOG_ID, 
    COMMUNICATIONS_ID 
    FROM consumer_action_log 
    WHERE COMM_TYPE_ID=4) AS cr
JOIN network_communications AS nc ON 
cr.COMMUNICATIONS_ID=nc.COMMUNICATIONS_ID
JOIN communication_interest_mapping AS cim ON 
nc.PARENT_COMMUNICATIONS_ID=cim.COMMUNICATION_ID
JOIN consumer_expert_score AS ces ON 
nc.SENDER_CONSUMER_ID=ces.CONSUMER_ID
        AND cim.CONSUMER_INTEREST_EXPERT_ID=ces.CONSUMER_EXPERT_ID;
War es hilfreich?

Lösung

Hoffe das hilft ... Hier ist einige MySQL Create Index -Anweisungen. Wenn Sie Indizes hinzufügen können, stellen Sie grundsätzlich sicher, dass ein Index jeder Ihrer Spalten abdeckt, die 2 oder mehr Tabellen verbinden.

CREATE INDEX idx_nc
ON network_communications(COMMUNICATIONS_ID);

CREATE INDEX idx_cim
ON communication_interest_mapping(COMMUNICATION_ID);

CREATE INDEX idx_ces
ON consumer_expert_score(CONSUMER_ID, CONSUMER_EXPERT_ID);

Abgeleitete Tabellen sind nicht von Natur aus schlecht, aber in diesem Fall (siehe unten) ziehen Sie alle Datensätze von Consumer_Action_Log, die eine comm_type_id von 4. haben, keine Verbindung zu den anderen Tabellen zurück. Das könnte die Ursache der SQL sein, die nie zurückkehrt.

SELECT cr.COMMUNICATIONS_ID, 
           cr.CONSUMER_ID, 
           cr.ACTION_LOG_ID, 
           nc.PARENT_COMMUNICATIONS_ID, 
           nc.SENDER_CONSUMER_ID, 
           ces.EXPERT_SCORE, 
           cim.CONSUMER_INTEREST_EXPERT_ID

    FROM (SELECT 234 AS CONSUMER_ID, 
             ACTION_LOG_ID, 
             COMMUNICATIONS_ID 
             FROM consumer_action_log 
             WHERE COMM_TYPE_ID=4) AS cr

JOIN network_communications AS nc ON 
         cr.COMMUNICATIONS_ID=nc.COMMUNICATIONS_ID

JOIN communication_interest_mapping AS cim ON 
         nc.PARENT_COMMUNICATIONS_ID=cim.COMMUNICATION_ID

JOIN consumer_expert_score AS ces ON 
         nc.SENDER_CONSUMER_ID=ces.CONSUMER_ID
        AND cim.CONSUMER_INTEREST_EXPERT_ID=ces.CONSUMER_EXPERT_ID;

Andere Tipps

Abgesehen von den Indizes, die in Ihren Suchtabellen vorhanden sind, wie in Anser von John ausgeführt, würde ich sicherstellen, dass Sie auch einen Index auf comm_type_ID in Ihrer Tabelle Consumer_Action_log haben.

Dann fügen Sie Ihrer Klausel ein Schlüsselwort hinzu ... Ich habe immer großartige Ergebnisse gesehen, wenn eine Abfrage gut organisiert ist, anstatt sich auf die Abfrage -Engine zu verlassen, um es optimieren zu können ...Sehen Sie hier eine andere Probe

SELECT STRAIGHT_JOIN
         cr.COMMUNICATIONS_ID AS ANSWER_ID,
         cr.CONSUMER_ID as VIEWER_ID,  
         etc... rest of your query...

Es könnte sein, dass der Optimierer versucht, andere Tabellen zu betrachten, um herauszufinden, was zu bekommen ist. Sehen Sie sich Kommentare in anderen Stackoverflow -Antwort an, auf den ich einen Link zur Verfügung gestellt habe.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top