Запрос с LEFT JOIN

Valentin

Новичок
Запрос с LEFT JOIN

Оооооооооооочень много времени занимает. Секунд 7-13.

Смысл в том, чтобы выбрать всех клиентов cl, у которых есть ненулевой users_id (куратор клиента u) с указанием фамилии куратора, даты последнего контакта MAX(ca.`date`), если она сть, а если нет, то выводится пустое значение, т.к. LEFT JOIN.

cl - клиенты, u - кураторы, ca - контакты кураторов с клиентами

SELECT

cl.clients_id, cl.company_name,

u.surname ,

MAX(ca.`date`) as `date`

FROM

(
clients cl LEFT JOIN calls ca ON (cl.clients_id = ca.clients_id)
)
LEFT JOIN users u ON (cl.users_id = u.users_id)

WHERE

(cl.users_id IS NOT NULL) AND (cl.users_id <> '')

GROUP BY cl.clients_id ORDER BY cl.company_name

Дело в том, что клиентов 30 000, и контактов уже 1 тысяча с лишним...

Если делать выборку клиентов, у которых есть кураторы, без получения контактов, то всё идёт быстро - 5409 клиентов, а если с контактами, то тоже 5409, но очень медленно.

LEFT JOIN users u ON (cl.users_id = u.users_id) - для того, что ещё есть поиск всех-всех клиентов (и с кураторами, и без них), поэтому я его в WHERE не убрал.

Как оптимизировать этот запрос, чтобы он шёл быстро. Что тут не так?
 
Индексы по нужным полям построены?

... чтобы узнать, какие поля "нужные", можно использовать explain.
 
Valentin А чего запись такая странная? Разве после FROM не надо указывать имя таблицы? У тебя там сразу запрос....
 
как это оптимизировать?
MAX(ca.`date`) as `date`
и
cl.clients_id = ca.clients_id

-~{}~ 27.01.06 09:40:

В `cl` поле `clients_id` - PRIMARY KEY, а в `ca` поле `calls_id`.
Выставил ещё в свойствах `ca` поле `clients_id` PRIMARY KEY.
Заработало намного быстрее при поиске.
 
Оба поля, по которым производишь соединения полезно индексировать.
 
а про user_id ты забыл? С ним те же манипуляции надо выполнить
и лишние скобочки в запросе тебе к чему?
 
Сверху