2017-06-23 2 views
0

J'essaie d'optimiser la requête mysql suivante. Il fonctionne en environ 2,5 secondes. J'ai lu les index composites, mais j'espère que quelqu'un pourra m'aider à comprendre comment vous ORDRE les index composés avec des requêtes de ce type contenant plusieurs jointures, plusieurs où les conditions (y compris les plages de dates), un groupe par et un ordre une valeur calculée. Ai-je manqué un index composé utile? Existe-t-il un moyen plus efficace d'extraire des données de ces tables? Toute aide est très appréciée!Compound Index Ordre Requête MySQL

SELECT 
branch.name AS branch, 
SUM(appointment.status = 'completed') AS `Completed`, 
SUM(appointment.status = 'cancelled') AS `Cancelled`, 
SUM(appointment.status = 'not completed') AS `Not Completed`, 
SUM(appointment.status != 'rescheduled') AS `Total` 
FROM rep 
JOIN customer ON rep.id = customer.rep_id 
JOIN office ON rep.office_id = office.id 
JOIN appointment ON customer.id = appointment.customer_id 
JOIN branch ON office.branch_id = branch.id 
WHERE rep.active= 1 
AND rep.group IN (1,2,3) 
AND rep.deleted = 0 
AND customer.saved = 0 
AND (customer.rep_id != appointment.closed_by OR appointment.closed_by IS NULL) 
AND customer.rep_id != 0 
AND customer.deleted = 0 
AND office.visible = 1 
AND office.deleted = 0 
AND appointment.date >= '2016-12-01' 
AND appointment.date < '2017-11-30' 
AND appointment.current = 1 
GROUP BY branch.id 
ORDER BY Completed 

est ici la sortie EXPLIQUER:

id: 1 
select_type: simple 
table: office 
type: ref 
possible_keys: PRIMARY, deleted_branchID_name, deleted_visible 
key: deleted_visible 
key_len: 5 
ref: const,const 
rows: 73 
Extra: Using index condition; Using temporary; Using filesort 

id: 1 
select_type: simple 
table: branch 
type: eq_ref 
possible_keys: PRIMARY 
key: PRIMARY 
key_len: 4 
ref: office.branch_id 
rows: 1 
Extra: NULL 

id: 1 
select_type: simple 
table: rep 
type: ref 
possible_keys: PRIMARY, group_id, office_id, active_deleted 
key: office_id 
key_len: 5 
ref: office.id 
rows: 57 
Extra: Using index condition; Using where 

id: 1 
select_type: simple 
table: customer 
type: ref 
possible_keys: PRIMARY, rep_id 
key: rep_id 
key_len: 4 
ref: rep.id 
rows: 61 
Extra: Using where 

id: 1 
select_type: simple 
table: appointment 
type: ref 
possible_keys: date, customer_id, closedByID_date, isCurrent_date 
key: customer_id 
key_len: 4 
ref: customer.id 
rows: 1 
Extra: Using where 
+0

Sans savoir quoi que ce soit au sujet de vos données, votre requête suggère la index 'office (supprimé, visible, branch_id)'. Cependant, cette table ne semble contenir qu'une poignée de lignes et cet index ne vous aidera probablement pas beaucoup; Pour choisir une meilleure stratégie, vous pouvez essayer d'identifier les filtres forts. Si par exemple 99% de vos données auront 'customer.saved = 1' ou' rendez-vous.current! = 1', vous pouvez essayer d'utiliser ceci pour optimiser votre requête - mais cela dépendra de vos données. Aussi, pour plus de clarté, vous devriez remplacer tout sauf votre dernier 'jointure gauche 'par un' join' (et le dernier aussi si 'office.branch_id' est' non null') – Solarflare

Répondre

0

Une suggestion

Retirer unuseful() autour de la condition

LEFT JOIN customer ON rep.id = customer.rep_id 
    LEFT JOIN office ON rep.office_id = office.id 
    LEFT JOIN appointment ON customer.id = appointment.customer_id 
    LEFT JOIN branch ON office.branch_id = branch.id