Запрос с 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 не убрал.

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

bkonst

.. хочется странного?...
Индексы по нужным полям построены?

... чтобы узнать, какие поля "нужные", можно использовать explain.
 

matilda

Новичок
Valentin А чего запись такая странная? Разве после FROM не надо указывать имя таблицы? У тебя там сразу запрос....
 

Valentin

Новичок
как это оптимизировать?
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.
Заработало намного быстрее при поиске.
 

Leksi

Новичок
Оба поля, по которым производишь соединения полезно индексировать.
 

Leksi

Новичок
а про user_id ты забыл? С ним те же манипуляции надо выполнить
и лишние скобочки в запросе тебе к чему?
 
Сверху