Domanda

Sto avendo problemi con l'uso di una tabella derivata in MySQL. Ha utilizzando una tabella derivata intrinsecamente rallentare l'elaborazione di una query?

Questa è la domanda che sto cercando di eseguire. Esso non verrà eseguito, a soli volte su.

Non riesce. Davvero, ho isolato il problema all'ultimo aderire. Quando prendo l'ultimo join funziona benissimo. Ma quando aggiungo l'ultima unirsi indietro in esso rifiuta di eseguire.

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;
È stato utile?

Soluzione

Spero che questo aiuti ... Ecco alcuni MySQL CREATE INDEX. In sostanza, se è possibile aggiungere indici, assicurarsi che non c'è un indice che copre ciascuna delle vostre colonne che collegare 2 o più tabelle.

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);

Le tabelle derivate non sono intrinsecamente cattivi, ma in questo caso (vedi sotto) si sta tirando tutti i record da consumer_action_log che hanno un comm_type_id di 4. Non sembra essere un attacco posteriore alle altre tabelle. Che potrebbe essere la causa del SQL non tornare mai.

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;

Altri suggerimenti

A parte gli indici che devono esistere sulle vostre tabelle di ricerca come le punte in Anser da John, vorrei essere sicuri di avere un indice COMM_TYPE_ID nella tabella consumer_action_log troppo.

Poi, aggiungere una parola chiave al vostro clausola ... Ho sempre visto grandi risultati quando una query è ben organizzato, invece di basarsi sul motore di query per optimze ... vedere un altro campione qui

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

Potrebbe essere l'ottimizzatore sta cercando di guardare in altri tavoli per capire cosa prendere. Vedere i commenti in altra risposta StackOverflow ho fornito link di collegamento.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top