Медленный запрос - несколько соединений и много данных - PullRequest
1 голос
/ 02 декабря 2009

Я уверен, что есть лучший способ сделать это. У меня есть три основные таблицы с большими объемами данных для просмотра: records_main, продажи и встречи. Каждый из которых содержит около 20 000 записей.

Мне нужно объединить эти три таблицы, а также несколько других, которые не являются двумя большими.

    $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
 ";

Это занимает несколько секунд, но, наконец, загружается. Последнее соединение, которое я добавил, похоже, разбивает запрос:

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

После этого у меня есть установленный лимит и группа по

Что я могу сделать, чтобы улучшить это? Я использую это с jqgrid, не уверен, поможет ли это

Ответы [ 2 ]

5 голосов
/ 02 декабря 2009

В качестве первого подхода попробуйте выполнить запрос к базе данных, используя синтаксис EXPLAIN. Это даст вам анализ заявления и скажет, использует ли он вообще индексы. Если он не использует индексы или недостаточно использует индексы, попробуйте добавить их в таблицы.

1 голос
/ 02 декабря 2009

Вы пробовали указывать индекс для всех столбцов, на которых вы осталось присоединиться?

TRY дает индекс всем этим, если они еще не объявлены как индекс

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...