【问题标题】:SQL query optimization for speedSQL查询优化速度
【发布时间】:2022-11-11 19:17:11
【问题描述】:

因此,我正在研究优化以下查询的问题,我已经从我的角度将其优化到了最大程度,这可以进一步优化吗?

select distinct name ad_type 
from dim_ad_type x  where exists  ( select 1 
                                    from sum_adserver_dimensions sum 
                                    left join dim_ad_tag_map on dim_ad_tag_map.id=sum.ad_tag_map_id and dim_ad_tag_map.client_id=sum.client_id 
                                    left join dim_site on dim_site.id = dim_ad_tag_map.site_id 
                                    left join dim_geo on dim_geo.id = sum.geo_id 
                                    left join dim_region on dim_region.id=dim_geo.region_id 
                                    left join dim_device_category on dim_device_category.id=sum.device_category_id 
                                    left join dim_ad_unit on dim_ad_unit.id=dim_ad_tag_map.ad_unit_id 
                                    left join dim_monetization_channel on dim_monetization_channel.id=dim_ad_tag_map.monetization_channel_id 
                                    left join dim_os on dim_os.id = sum.os_id 
                                    left join dim_ad_type on dim_ad_type.id = dim_ad_tag_map.ad_type_id 
                                    left join dim_integration_type on dim_integration_type.id = dim_ad_tag_map.integration_type_id 
                                    where sum.client_id = 50 
                                    and dim_ad_type.id=x.id 
                                    ) 
order by 1 

【问题讨论】:

  • 你最好在dba.stackexchange.com上问这个问题
  • 是的。不,也许。请发布架构、示例数据和 EXPLAIN 的输出。没有这些信息,我们只是猜测。
  • 您需要在dim_ad_typedim_ad_tag_mapsum_adserver_dimensions 之间有一个join(而不是left join)。其他所有表都不需要在这里。您不需要子查询。
  • 子查询格式错误。 and dim_ad_type.id=x.id 默默地将外连接转换为内连接。你确定你想要那个?

标签: mysql sql mysql-workbench


【解决方案1】:

您的查询虽然加入正常,但总体上是膨胀的。您在外部使用 dim_ad_type 表,只是为了确保它也存在于内部。您拥有所有与最终结果无关的左连接,为什么它们甚至在那里。我会通过颠倒逻辑来简化。通过跟踪同一个 dim_ad_type 表的 INNER 查询,我发现以下是直接行。总和 -> dim_ad_tag_map -> dim_ad_type。运行它。

select distinct
        dat.name Ad_Type
    from
        sum_adserver_dimensions sum
            join dim_ad_tag_map tm
                on sum.ad_tag_map_id = tm.id
                and sum.client_id = tm.client_id
                join dim_ad_type dat
                    on tm.ad_type_id = dat.id 
    where
        sum.client_id = 50 
    order by 
        1

您的查询正在运行所有 dim_ad_types,然后查找所有总和以找到匹配的那些。直接从一个客户端开始运行,然后直接使用 JOIN。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-11-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-30
    • 2021-03-06
    • 1970-01-01
    • 2016-11-22
    相关资源
    最近更新 更多