Не могу увеличить скорость запроса

Рейтинг: 2Ответов: 2Опубликовано: 05.04.2015

Есть две таблицы: Клиенты, Заказы_Клиентов. Хочу сделать запрос, кто из клиентов делал последний заказ в этом году

SELECT clients.*, orders.date FROM clients LEFT JOIN orders USING(client_id) 
WHERE orders.date >= '2015-01-01' GROUP BY client_id ORDER BY orders.date DESC;

Индексы у таблиц есть. Всё бы ничего, но на 100К клиентах и на 1М заказах скорость выполнения запроса отставляет желать лучшего. Ничего лучше чем ввести клиенту колонку с датой последнего заказа я не нашёл, но может можно оптимизировать запрос?

Ответы

▲ 4Принят
SELECT o.m_d, c.* FROM 
(SELECT client_id, MAX(date) AS m_d FROM orders WHERE date >= '2014-01-01' GROUP BY client_id) AS o
INNER JOIN clients AS c USING(client_id);

Вот так получилось очень быстро и то что нужно. Спасибо @IvanZakirov

▲ 1

конструкция JOIN увеличивает время обработки запроса при большом количестве записей (ну там еще от условий зависит).

SELECT 
  clients.*, 
  max(orders.date) -- вывести максимальную дату, она же последняя (желательно еще там время учитвать, вдруг в 1 день несколько клиентов брали заказы)
FROM 
  clients c,
  orders o
WHERE 
  c.id = o.client_id
GROUP BY 
  client_id 
ORDER BY 
  orders.date DESC

или еще вариант по максимальному ID заказа - он же последний будет:

SELECT 
  clients.name, 
  max(orders.id) -- вывести максимальную дату, она же последняя (желательно еще там время учитвать, вдруг в 1 день несколько клиентов брали заказы)
FROM 
  clients c,
  orders o
WHERE 
  c.id = o.client_id
GROUP BY 
  clients.name 
ORDER BY 
  orders.date DESC