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