Question

Je vais avoir du mal à l'aide d'une table dérivée de MySQL. Est-ce que l'aide d'une table dérivée lente par nature sur le traitement d'une requête?

Voici la requête que je suis en train de courir. Il ne sera pas exécuté et le temps à la sortie.

Il ne réussit. Vraiment, j'ai isolé le problème à la dernière jointure. Quand je prends la dernière jointure, il fonctionne très bien. Mais quand j'ajoute la dernière joindre à nouveau, il refuse d'exécuter.

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;
Était-ce utile?

La solution

Hope this helps ... Voici quelques MySQL INDEX CREATE. En gros, si vous pouvez ajouter des index, assurez-vous qu'il ya un indice qui couvre chacun de vos colonnes de connexion 2 ou plusieurs tables.

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

tables dérivées ne sont pas intrinsèquement mauvais, mais dans ce cas (voir ci-dessous) vous tirez tous les enregistrements de consumer_action_log qui ont un comm_type_id de 4. Il ne semble pas être un retour de connexion aux autres tables. Cela pourrait être la cause du sql ne jamais revenir.

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;

Autres conseils

En dehors des indices qui devraient exister sur vos tables de recherche comme sur pointue dans Anser par John, je vous assurer d'avoir un index sur COMM_TYPE_ID dans votre table consumer_action_log aussi.

Ensuite, ajoutez un mot-clé à votre disposition ... Je l'ai toujours vu d'excellents résultats lorsqu'une requête est bien organisée au lieu de compter sur le moteur de recherche pour optimze ... voir un autre échantillon

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

Il est peut-être l'optimiseur tente de regarder d'autres tables pour comprendre ce qu'il faut obtenir. Voir commentaires dans une autre réponse que je StackOverflow ai fourni lien.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top