2010-04-03 1 views
0

Я обычно использую ОРМ вместо SQL и я немного оторваны на различные JOIN и ...Оптимизация (My) SQL Query

SELECT `order_invoice`.* 
    , `client`.* 
    , `order_product`.* 
    , SUM(product.cost) as net 
    FROM `order_invoice` 
    LEFT JOIN `client` 
    ON order_invoice.client_id = client.client_id 
    LEFT JOIN `order_product` 
    ON order_invoice.invoice_id = order_product.invoice_id 
    LEFT JOIN `product` 
    ON order_product.product_id = product.product_id 
WHERE (order_invoice.date_created >= '2009-01-01') 
    AND (order_invoice.date_created <= '2009-02-01') 
GROUP BY `order_invoice`.`invoice_id` 

Таблицы/столбцы логически имена ... что это магазин тип приложения ... запрос работает ... это очень очень медленно ...

Я использую Zend Framework и обычно использовал Zend_Db_Table_Row::find(Parent|Dependent)Row(set)('TableClass'), но мне нужно сделать много соединений, и я подумал, что это улучшит производительность на делая все это в одном запросе вместо сотен ...

Могу ли я улучшить выше запроса, используя более подходящие JOIN или другую реализацию? Большое спасибо.

ответ

1

Запрос неверный, GROUP BY ошибочно. Все столбцы в элементе SELECT, которые не находятся в агрегированной функции, должны быть в GROUP BY. Вы упоминаете только одну колонку.

Измените режим SQL, установите его на ONLY_FULL_GROUP_BY.

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

 Смежные вопросы

  • Нет связанных вопросов^_^