提高查询效率

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 表中添加一列,并在添加或删除任何交易时通过触发器对其进行更新。这样,您在添加/删除时完成一次计数,但所有未来的引用不再需要应用计数。这可能是您可以申请性能的最佳选择。

【讨论】:

以上是关于提高查询效率的主要内容,如果未能解决你的问题,请参考以下文章

提高查询效率

oracle提高查询效率的34条方法

提高Order by语句查询效率的两个思路

优化 sql 查询以提高效率

Lucene4.6查询时完全跳过打分,提高查询效率的实现方式

sql语句提高数据库查询效率