我遇到过一个问题,在工作时,很难理解(做出更改),而且我的意见没有得到优化。
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;
你能否提出让它变得更简单的方法。
由于
答案 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计数,但所有将来的引用都不再需要应用计数。这可能是您可以申请表现的最佳方式。