提高查询效率
Posted
技术标签:
【中文标题】提高查询效率【英文标题】:Making query efficient 【发布时间】:2014-11-10 14:41:50 【问题描述】:我遇到了一个查询,该查询在工作时难以理解(进行更改),并且在我看来是未优化的。
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】:如 cmets 中所述,索引可能是您查询的一个重要因素。
我会首先确认您至少有以下可用索引
table index
deals (category, e_order, itemid )
category_parent (active, id )
通常情况下,我会在 order by 之前有 itemID,因为它是 WHERE 子句的一部分,但是由于您获得的所有 ID 除外,我认为 order-by 子句列会有所帮助。
还有一个注意事项...您用于获取计数的“dc”查询正在对所有条目进行计数,但您的外部查询仅考虑“active=1”。我也会通过
在您的“dc”查询中添加这个限定符WHERE a.Active='1' AND -- rest of your criteria
最后,作为一个网站,反复进行计数总是会对性能产生很大影响。正如其他帖子和此处再次建议的那样,您最好为“Deals_In_Cat”在 category_parents 表中添加一列,并在添加或删除任何交易时通过触发器对其进行更新。这样,您在添加/删除时完成一次计数,但所有未来的引用不再需要应用计数。这可能是您可以申请性能的最佳选择。
【讨论】:
以上是关于提高查询效率的主要内容,如果未能解决你的问题,请参考以下文章