Query lenta: join multipli e molti dati
-
11-09-2019 - |
Domanda
Sono sicuro che esiste un modo migliore per farlo.Ho tre tabelle principali con grandi quantità di dati da esaminare:records_main, vendite e appuntamenti.Ciascuno con quasi 20.000 record.
Devo unire questi tre tavoli e alcuni altri che non siano due grandi.
$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
";
L'operazione richiede alcuni secondi ma alla fine viene caricata.L'ultimo join che ho inserito sembra però interrompere la query insieme:
LEFT JOIN core_records_sales as sales ON appointments.day = sales.day_sold AND appointments.customer = sales.customer
Dopodiché ho un limite impostato e un gruppo per
Posso fare qualcosa per migliorarlo?Lo sto usando con jqgrid, non sono sicuro che sia d'aiuto
Soluzione
Come primo approccio, prova ad eseguire la query sul database utilizzando la sintassi EXPLAIN.Questo ti fornirà un'analisi della dichiarazione e ti dirà se utilizza degli indici.Se non utilizza indici o non ne ha abbastanza, prova ad aggiungerli alle tabelle.
Altri suggerimenti
Hai provato a fornire l'indice su tutte le colonne su cui ti stai iscrivendo?
PROVA a dare l'indice a tutti questi se non sono già dichiarati come indice