视图/子查询中未使用的列(MySQL)

时间:2014-06-21 15:22:11

标签: mysql sql database-performance

如果查询的结果集不使用子查询或视图生成的字段,那么该字段是否仍由子查询处理?我的数据库中有很多用于许多地方的视图,但所需的确切字段集因上下文而异。我没有在每个上下文中复制相似的查询(使用适当的字段组),而是使用了可能包含每个上下文的额外字段的视图。看起来这些额外的视图会影响MySQL的性能(通过删除下面示例中的额外字段,我的性能提升了1/4)。有解决方案吗不同的数据库(即Oracle)?

见下面的例子;运行视图时可以清楚地跳过charge_off_date字段,但它仍会影响性能。

select 
    l.loan_id, last_payment_date
from
    loans as l
        left join
    (select 
        loan_id,
            max(ph.received_d) as last_payment_date,
            max(case
                when ph.co = 1 then coalesce(ph.received_d, ph.month)
                else null
            end) as charge_off_date
    from
        payment_history as ph) as payment_stats ON payment_stats.loan_id = l.loan_id

1 个答案:

答案 0 :(得分:0)

MySQL实例化(非相关)子查询,并为未在视图之外优化的视图创建执行计划。换句话说,MySQL在这种情况下不会优化。

其他数据库在优化方面更聪明。这并不意味着他们会做正确的事,但有机会。

但我建议您将查询编写为只有join的聚合且没有子查询:

select l.loan_id, max(ph.received_d) as last_payment_date,
       max(case when ph.co = 1 then coalesce(ph.received_d, ph.month)
           end) as charge_off_date
from loans l left join
     payment_history ph
     on ph.loan_id = l.loan_id
group by l.loan_id;

from子句中不需要子查询(无论如何都不允许在MySQL视图中使用)。另外,如果您有where子句,则应该利用where子句并提高性能。