提高查询效率

时间:2014-11-10 14:41:50

标签: mysql sql query-optimization

我遇到过一个问题,在工作时,很难理解(做出更改),而且我的意见没有得到优化。

SELECT cp.`order` AS `order`, cp.parent_id, cp.id AS category_id, cp.stub, cp.name as category_name, dc.deals_in_cat, d.*
    FROM category_parent cp,
    (
        SELECT id, title, subtitle, image, image_m, discount, itemid, price, new_price, catalog_id, property_id, seller_id, category FROM deals 
            WHERE deals.category = 1 
            AND itemid NOT IN (156785431) 
            ORDER BY e_order LIMIT 8
    ) d,
    (
        SELECT a.`id` AS parent_id, COUNT( DISTINCT c.`itemid` ) AS deals_in_cat
            FROM `category_parent` AS a 
            LEFT JOIN `navigation_filters_weightage` AS d ON a.`id` = d.`cat_id`, 
                `deals_parent_cat` AS b,
                `deals` AS c 
            WHERE a.`parent_id` = b.`id` 
            AND c.`category` = a.`id` GROUP BY a.id ORDER BY b.`order` ASC , a.`order` ASC
    ) AS dc
    WHERE cp.id = d.category 
    AND cp.active = '1' 
    AND dc.parent_id = cp.id;

你能否提出让它变得更简单的方法。

由于

1 个答案:

答案 0 :(得分:1)

如评论中所述,索引可能是您查询的一个重要因素。

我首先要确认你至少有以下可用的索引

table            index
deals            (category, e_order, itemid )
category_parent  (active, id )

通常情况下,我会在订单之前获得itemID,因为它是WHERE子句的一部分,但由于您获得了所有EXCEPT一个ID,我认为order-by子句列可以提供更多帮助。

另外一个注意事项......你的" dc"获取计数的查询正在对所有条目进行计数,但您的外部查询仅考虑" active = 1"。我会在你的" dc"中添加这个限定符。通过

查询
WHERE  a.Active='1' AND  -- rest of your criteria

最后,作为一个网站,反复进行计数总是会成为一个重大的性能打击。正如在其他帖子中所建议的那样,您可以通过在category_parents表中为" Deals_In_Cat"添加一个列来更好。并在添加或删除任何交易时通过触发器更新。这样,您可以在添加/删除时完成ONCE计数,但所有将来的引用都不再需要应用计数。这可能是您可以申请表现的最佳方式。