requête lente - Multiple jointures et beaucoup de données
-
11-09-2019 - |
Question
Je suis sûr qu'il ya une meilleure façon que je pourrais faire cela. J'ai trois tables principales avec de grandes quantités de données à exécuter par: records_main, les ventes et les rendez-vous. Chaque avec près de 20.000 dossiers.
Je dois joindre ces trois tables, ainsi que quelques autres qui arn't deux grandes.
$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 ne finalement charge. La dernière jointure 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 un ensemble limite et un groupe par
Tout ce que je peux faire pour améliorer cela? J'utilise cela avec jqGrid, pas sûr si cela aide
La solution
En tant que première approche, essayez d'exécuter la requête sur la base de données en utilisant la syntaxe EXPLIQUER. Cela vous donnera une analyse de la déclaration et vous indique, si elle utilise des index du tout. Si elle ne pas utiliser les index ou pas assez d'index, essayez de les ajouter aux tables.
Autres conseils
Avez-vous essayé index donnant sur toutes les colonnes que vous êtes à gauche devenant membre?
ESSAYEZ indice donnant à tous ces si elles ne sont pas déjà déclarés comme indice