2009-12-02 7 views
1

Je suis sûr qu'il y a une meilleure façon de le faire. J'ai trois tables principales avec de grandes quantités de données à parcourir: records_main, ventes et rendez-vous. Chacun avec près de 20 000 enregistrements.Requête lente - Jointures multiples et beaucoup de données

J'ai besoin de joindre ces trois tables ainsi que quelques autres qui ne sont pas deux grands.

$SQL = "SELECT DISTINCT appointments.id AS aid, appointments.date, appointments.estimate_price, appointments.next_action, appointments.next_action_date, appointments.result, appointments.result_type, appointments.notes, 
customer.id AS cid, customer.homeowner1_fname, customer.homeowner1_lname, customer.address, customer.city, customer.state, customer.zipcode, customer.phone1, customer.phone1_type, customer.phone2, customer.phone2_type, customer.phone3, customer.phone3_type, customer.phone4, customer.phone4_type, customer.phone5, customer.phone5_type, customer.lead_source, customer.lead_category, customer.primary_interest, customer.secondary_interest, customer.additional_interest1, customer.additional_interest2, 
originator.employee_id AS originator_employee_id,originator.fname AS originator_fname,originator.lname AS originator_lname, 
setter.employee_id AS setter_employee_id,setter.fname AS setter_fname,setter.lname AS setter_lname, 
resetter.employee_id AS resetter_employee_id, resetter.fname AS resetter_fname, resetter.lname AS resetter_lname, 
salesrep.employee_id AS salesrep_employee_id, salesrep.fname AS salesrep_fname, salesrep.lname AS salesrep_lname, 
salesrep2.employee_id AS salesrep2_employee_id, salesrep2.fname AS salesrep2_fname, salesrep2.lname AS salesrep2_lname 
FROM 
core_records_appointments as appointments 
INNER JOIN core_records_main as customer ON appointments.customer = customer.id 
LEFT JOIN core_employees_main as originator ON appointments.originator = originator.id 
LEFT JOIN core_employees_main as setter ON appointments.setter = setter.id 
LEFT JOIN core_employees_main as resetter ON appointments.resetter = resetter.id 
LEFT JOIN core_employees_main as salesrep ON appointments.sales_representative = salesrep.id 
LEFT JOIN core_employees_main as salesrep2 ON appointments.sales_representative2 = salesrep2.id 
"; 

Cela prend quelques secondes, mais finalement charge. La dernière rejoins je mets semble bien rompre la requête ensemble:

LEFT JOIN core_records_sales as sales ON appointments.day = sales.day_sold AND appointments.customer = sales.customer 

Après cela, j'ai une limite fixée et un groupe par

Tout ce que je peux faire pour améliorer cela? J'utilise ceci avec jqgrid, je ne sais pas si cela aide

Répondre

5

Dans une première approche, essayez d'exécuter la requête sur la base de données en utilisant la syntaxe EXPLAIN. Cela vous donnera une analyse de la déclaration et vous dira, si elle utilise des index du tout. S'il n'utilise pas d'index ou pas assez d'index, essayez de les ajouter aux tables.

+0

Je suppose que lorsque je tente de faire correspondre les sales.day et appts.day il est coincé parce qu'il n'y a pas de clé. Je n'ai jamais eu plus d'une clé dans une table. Comment ferais-je pour mettre ça en place? Cela causerait-il un problème avec quoi que ce soit d'autre? C'est à dire: l'identifiant pour les deux sont les clés primaires – kilrizzy

+0

Pourriez-vous ajouter la structure des tables à la question? (DESCRIBE ) Cela aiderait beaucoup à répondre à la question –

1

Avez-vous essayé de donner un index sur toutes les colonnes sur lesquelles vous êtes à gauche?

index essayer de donner tous ces si elles ne sont pas déjà déclarés comme indice

Questions connexes