2015-10-12 2 views
-1

У меня есть запрос в MySQL. Он показывает, что сервер mysql ушел. Что не так с запросом?Есть ли способ, которым я могу оптимизировать запрос ниже?

SELECT Customer.id, 
     Customer.first_name, 
     Customer.last_name, 
     Sum(Sale.`cal_qty`) AS totPurchase, 
     Sale2.tot2   AS totPurchase2 
FROM `customers` AS Customer 
     LEFT JOIN `sales` AS Sale 
       ON Sale.customer_id = Customer.id 
     LEFT JOIN (SELECT s2.customer_id AS customer_id, 
         Sum(s2.cal_qty) AS tot2 
        FROM sales AS s2 
        WHERE s2.sale_date BETWEEN '2015-08-13' AND '2015-09-11' 
        GROUP BY s2.customer_id) AS Sale2 
       ON Sale.customer_id = Sale2.customer_id 
WHERE Sale.sale_date BETWEEN '2015-09-12' AND '2015-10-12' 
GROUP BY Sale.`customer_id` 

Просьба предлагать любые оптимизации, которые я могу сделать по этому запросу. Он уже правильно индексировал нужные столбцы.

+1

Просьба указать надлежащие DDL и EXPLAIN для них. Также 'LEFT JOIN sale ... WHERE sale' равна' INNER JOIN sale', так что вы можете так же написать этот бит для начала. – Strawberry

+0

Индексирование на customer_id и дату. Что нужно от этого sql-запроса. Он должен дать продажи в прошлом месяце и продажи последнего в прошлом месяце против customer_id. нужно выяснить, делает ли клиент больше, чем в предыдущем месяце, если нет, то он не должен входить в этот список после того, как результат будет получен. – Dnyanesh

+0

Улучшенный английский в ответе –

ответ

0

Просьба указать SHOW CREATE TABLE.

Пожалуйста, объясните необходимость использования LEFT. Если вы не можете, то избавитесь от LEFT.

Добавить эти индексы:

INDEX(sale_date) 
INDEX(customer_id, sale_date) 
0

Во-первых, ваш ИНЕКЕ в квалифицируя РАСПРОДАЖА таблицу, таким образом, превращая его в РЕГИСТРИРУЙТЕСЬ против LEFT JOIN. Поскольку это является основной базой ваших критериев, я бы поставил это в ведущую позицию FROM, поскольку я скорректировал запрос (и сокращенные псевдонимы)

Для оптимизации индексов один индекс должен быть в ГДЕ И ГРУППЕ, но также имеют любые столбцы, которые могут использоваться в JOIN. Таблица

продаж ... индекса (sale_date, customer_id, cal_qty)

Это позволит оптимизировать внешние и внутренние запросы к активности продаж по дате, сгруппированной клиентом. Наличие индекса «покрытия», включающего поле Cal_Qty, предотвращает необходимость возврата к страницам необработанных данных для запроса. Он может делать все, что нужно от компонентов индекса напрямую.

Таблица клиентов должна рассчитывать на включение индекса (id), поскольку он будет основным ключом к соединению этой таблицы.

SELECT 
     C.id, 
     C.first_name, 
     C.last_name, 
     Sum(S.cal_qty) AS totPurchase, 
     Sale2.tot2 AS totPurchase2 
    FROM 
     sales S 
     JOIN customers AS C 
      ON S.customer_id = C.id 
     LEFT JOIN (SELECT 
          s2.customer_id AS customer_id, 
          Sum(s2.cal_qty) AS tot2 
         FROM 
          sales AS s2 
         WHERE 
          s2.sale_date BETWEEN '2015-08-13' AND '2015-09-11' 
         GROUP BY 
          s2.customer_id) AS Sale2 
      ON S.customer_id = Sale2.customer_id 
    WHERE 
     S.sale_date BETWEEN '2015-09-12' AND '2015-10-12' 
    GROUP BY 
     S.customer_id 
Смежные вопросы