2010-04-03 104 views
0

我通常使用ORM,而不是SQL,我稍稍脫節對不同的連接...優化(我的)SQL查詢

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框架,通常會使用Zend_Db_Table_Row::find(Parent|Dependent)Row(set)('TableClass'),但我必須做大量的連接,我認爲它會提高性能全部在一個查詢中而不是數百個...

我可以改進上面的查詢通過使用更合適的JOIN或不同的實現?非常感謝。

回答

1

查詢是錯誤的,GROUP BY是錯誤的。 SELECT部分​​中不在聚合函數中的所有列必須位於GROUP BY中。你只提到一列。

更改SQL模式,將其設置爲ONLY_FULL_GROUP_BY

完成此操作並且您具有正確的查詢後,請使用EXPLAIN查找查詢的執行方式以及使用的索引。然後開始優化。