2015-11-17 2 views
0

Я выполнения этого запросаГРУППА выпуску и сумма() исполнение

SELECT sum(c.cantitate) AS num, 
produse.*, 
cc.seo 
FROM produse 
LEFT JOIN comenzi c ON produse.id = c.produs 
LEFT JOIN cosuri cs ON c.cos = cs.id 
LEFT JOIN categorii cc ON produse.categorie = cc.id 
WHERE cs.status = 'closed' AND produse.vizibil ='1' 
GROUP BY produse.id 
ORDER BY num DESC 
LIMIT 14 

изменяемых строк: 0 Найдено строк: 14 Предупреждения: 0 Продолжительность за 1 запрос: 11,734 сек.
Без GROUP BY и суммы требуется 16 мс.
Этот запрос используется для получения списка 14 самых продаваемых товаров на основе продажи количества.
Как я могу переписать запрос для повышения производительности?

+0

У вас есть индексы на столбцах 'SUM' и' GROUP BY'? – Martin

+1

двигателю необходимо случайным образом выбрать значение для каждого столбца в элементе, который не является агрегатом, а не группой. Попробуйте добавить каждый столбец в группу выбора. Или вам действительно неважно, какие значения выбраны из produse. * И cc.seo? – xQbert

+0

Мне все они нужны от produse (продукты) – speedy

ответ

1

Может быть, вам нужно сгенерировать сумму, прежде чем стыки ...

Per комментарий, чтобы отметить на оригинальный вопрос:

Хотите сумму comenzi до присоединяется к cosuri и categorii, которые может иметь несколько записей, вызывающих потенциально раздутую сумму или после присоединения, возможно, с раздутой суммой?

SELECT c.cantitate AS num, 
produse.*, 
cc.seo 
FROM produse 
LEFT JOIN (Select produs, cos, sum(cantitate) as cantitate 
      FROM comenzi 
      GROUP BY produs, cos) c ON produse.id = c.produs 
LEFT JOIN cosuri cs ON c.cos = cs.id 
LEFT JOIN categorii cc ON produse.categorie = cc.id 
WHERE cs.status = 'closed' AND produse.vizibil ='1' 
ORDER BY num DESC 
LIMIT 14 

Пример: Если comenzi имеет запись с ID 1 и сов 'A' и cantitate из 3 и присоединяется к cosuri на основе CS.ID, который имеет для ID 'A' в списке 3 раза, то сумма для кантата будет вычислена 3 + 3 + 3 (9) вместо Just 3 ... что может быть проблемой. Если мы вычислим сумму заранее, мы избежим проблемы (если она одна) и накладных расходов суммирования, что значения могут быть тысячи раз в зависимости от мощности между cosuri и категорией для comenzi. Что ... может улучшить производительность.

Чтобы знать наверняка, если это позволит повысить производительность, мы на самом деле должны были бы

  1. Понимание требований результатов (Сумма, прежде чем присоединиться к или после?)
  2. Смотрите некоторые выборочные данные наряду с статистикой каждая таблица, чтобы знать количество записей
  3. Знание индексов между объединениями таблиц и любым предложением where Критерии
  4. Вид плана объяснения в базе данных.

Без этих деталей мы не можем точно знать, что действительно поможет. Все есть догадки без фактов; которых здесь немного)

+1

Я удалил комментарий, он казался мелким. Я попытался улучшить ответ, чтобы решить вопрос о мощности. Однако сказать, что вопрос не задавался ... это было. Этот «Ответ» должен был решить проблему суммирования, если она существует (которая основана на прошлом опыте, вероятно, делает). @Drew: thank's, чтобы снова включить меня в правильное настроение. – xQbert

+0

честно, я даже не прочитал ни одного из них, прежде чем опубликовать это. Поэтому я, возможно, был груб. Сожалею. Редактировать: я читал некоторые, но был в затруднительном положении – Drew