Problèmes de performances avec table dérivée dans SQL
-
24-10-2019 - |
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;
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.