2012-11-21 9 views
0

Des idées pour optimiser la requête SQL suivante? Cela prend beaucoup de temps à courir. Habituellement environ 3-8 secondes selon le produit.Optimiser la requête MySQL - durée d'exécution longue

SELECT 
`serviceid` 

FROM 
`services` 

INNER JOIN `products` ON `serviceid`=products.`id` 

WHERE 
`orderid` IN 
(
    SELECT `orderid` FROM `orders_items`,`orders` 

    WHERE 
    `orderid`=orders.`id` AND 
    `status` > '2' AND 
    `serviceid`='___SYSTEM_VARIABLE___' 
) 

AND NOT 
`serviceid`='___SYSTEM_VARIABLE___' AND 
products.`state`='1' AND 
products.`stock` > 0 

GROUP BY 
`serviceid` 

ORDER BY 
COUNT(`serviceid`) DESC LIMIT 15 

Merci!

+2

Vous allez sans doute besoin de nous montrer la sortie de SHOW CREATE table' pour chacune des tables mentionnées ci-dessus, ainsi que ' EXPLAIN SELECT' pour cette requête. – whamma

Répondre

0

Supprimez l'entrée (select ...) et lancez-la dans la requête principale en tant que jointures supplémentaires. Voici ma conjecture, puisque je ne connais pas vos structures de table:

SELECT 
    `serviceid` 
FROM 
    `services` 
    INNER JOIN `products` 
    ON `serviceid` = products.`id` 
    INNER JOIN `orders` 
    ON `products`.`orderid` = `orders`.`id` 
    INNER JOIN `orders_items` 
    ON `orderid` = `orders`.`id` 
WHERE services.`serviceid` = '___SYSTEM_VARIABLE___' 
    AND products.`state` = '1' 
    AND products.`stock` > 0 
    AND `orders`.`status` > '2' 
    AND `orders`.`serviceid` = '___SYSTEM_VARIABLE___' 
GROUP BY `serviceid` 
ORDER BY COUNT(`serviceid`) DESC 
LIMIT 15