2010-11-01 4 views
2

J'ai une requête de sélection MySQL avec un grand nombre de jointures à gauche, mais une seule des jointures cause de sérieux problèmes de performance. Cette table gênante contient 2 champs BLOB, et quand j'ai quitté la jointure sur sa clé primaire, la requête prend 20 fois plus de temps à s'exécuter. Puisque c'est la seule table causant le problème, je suppose que les BLOB ont quelque chose à voir avec cela (même s'ils ne sont pas sélectionnés ou joints). Notez que le nombre de lignes dans cette table n'est pas particulièrement important par rapport aux autres tables jointes.La requête MySQL est lente lors de la jonction sur des tables contenant des BLOB

Comment puis-je accélérer cette requête?

EDIT - voici la requête (la table problématique est "observations"):

SELECT 
actions.id, 
actions.facebook_id, 
actions.created_at, 
actions.current_total_points, 
actions.current_weekly_points, 
submissions.id AS submission_id, 
submissions.challenge_week_number AS submission_challenge_week_number, 
submissions.challenge_number_in_week AS submission_challenge_number_in_week, 
reward_events.id AS reward_event_id, 
reward_events.reward_event_type_id, 
reward_events.action_id, 
reward_events.awarded_badge_type_id, 
reward_events.for_week_number AS reward_event_for_week_number, 
reward_events.challenge_number_in_week AS reward_event_challenge_number_in_week, 
challenge_weeks.week_number 
from actions 
left join submissions ON submissions.action_id = actions.id 
left join reward_events ON reward_events.action_id = actions.id 
left join challenge_weeks ON challenge_weeks.start_date <= CAST(actions.created_at AS DATE) AND challenge_weeks.end_date >= CAST(actions.created_at AS DATE) 
where actions.facebook_id = '12345678' 
order by actions.id asc 

Voici le résultat expliquiez la table "soumissions":

id      bigint(11) unsigned   NO PRI auto_increment 
action_id     bigint(11)     NO 
title      varchar(255)     YES 
description    varchar(255)     YES 
submission_type   enum('alpha','beta','gamma') YES 
filename     varchar(255)     YES 
ip_address    varchar(255)     YES 
community_release   bit(1)      YES 
approved     bit(1)      YES 
fullsize     longblob      YES 
thumb      longblob      YES 
modified_at    timestamp      YES CURRENT_TIMESTAMP 
challenge_week_number  tinyint(1)     YES 
challenge_number_in_week tinyint(1)     YES 
+2

Pourriez-vous s'il vous plait signaler votre requête? Il est toujours plus facile d'optimiser une requête quand vous la voyez. – Quassnoi

+1

Également afficher la sortie de EXPLAIN et les structures des tables impliquées aidera beaucoup – Mchl

Répondre

1

Avez-vous essayé de créer index sur les champs non-PK que vous rejoignez, comme submissions.action_id et reward_events.action_id? Cela devrait entraîner une diminution du temps de requête proportionnelle à la taille des tables auxquelles vous vous joignez.

Questions connexes