2010-04-03 22 views
0

J'utilise habituellement ORM au lieu de SQL et je suis un peu hors de contact sur les différents JOIN ...Optimisation (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` 

Les tables/colonnes sont logiquement noms ... c'est une boutique type d'application ... la requête fonctionne ... c'est très très lent ...

J'utilise le Zend Framework et j'utilise habituellement Zend_Db_Table_Row::find(Parent|Dependent)Row(set)('TableClass') mais je dois faire beaucoup de jointures et je pensais que ça améliorerait les performances en le faire tout en une requête au lieu de centaines ...

Puis-je améliorer le ci-dessus requête en utilisant plus approprié JOINs ou une implémentation différente? Merci beaucoup.

Répondre

1

La requête est erronée, le GROUP BY est erroné. Toutes les colonnes de la partie SELECT qui ne sont pas dans une fonction d'agrégat doivent être dans GROUP BY. Vous ne mentionnez qu'une seule colonne.

Modifiez le mode SQL, définissez-le sur ONLY_FULL_GROUP_BY. Lorsque cela est fait et que vous avez une requête correcte, utilisez EXPLAIN pour savoir comment la requête est exécutée et quels index sont utilisés. Puis commencez à optimiser.