优化此SQL查询?

lea*_*_rj 2 mysql sql database rdbms

我正在使用MySQL DB.我有两张桌子 -

  1. Product_Data(它有一些列,包括PK productDataId)
  2. Product_Data_Link(它有5列Id(PK),productDataId(FK),LinkTypeId,IsActive,ProductDataLinkUrl)

我在一个服务调用中运行此查询以获取多个产品.有没有办法优化它以实现快速执行.

select
    link1.ProductDataLinkUrl as ProductDataUrl1,
    link2.ProductDataLinkUrl as ProductDataUrl2,
    link3.ProductDataLinkUrl as ProductDataUrl3 ,
    link4.ProductDataLinkUrl as ProductDataUrl4 
FROM
    product_data pd 
left join
    product_data_links link1 
        on link1.ProductDataId = pd.ProductDataId 
        and link1.ProductDataLinkTypeId = 1 
        and link1.ProductDataLinkIsActive = 1 
left join
    product_data_links link2 
        on link2.ProductDataId = pd.ProductDataId 
        and link2.ProductDataLinkTypeId = 2 
        and link2.ProductDataLinkIsActive = 1 
left join
    product_data_links link3 
        on link3.ProductDataId = pd.ProductDataId 
        and link3.ProductDataLinkTypeId = 3 
        and link3.ProductDataLinkIsActive = 1 
left join
    product_data_links link4 
        on link4.ProductDataId = pd.ProductDataId 
        and link4.ProductDataLinkTypeId = 4 
        and link4.ProductDataLinkIsActive = 1 
WHERE
    pd.ProductDataId = 99999
Run Code Online (Sandbox Code Playgroud)

Gor*_*off 5

使用以下索引您的查询应该没问题:

  • product_data(ProductDataId)
  • product_data_links(ProductDataId, ProductDataLinkTypeId, ProductDataLinkIsActive)

在某些情况下,使用起来会更快group by:

  select max(case when ProductDataLinkTypeId = 1 then ProductDataLinkUrl end) as ProductDataUrl1,
         max(case when ProductDataLinkTypeId = 2 then ProductDataLinkUrl end) as ProductDataUrl2,
         max(case when ProductDataLinkTypeId = 3 then ProductDataLinkUrl end) as ProductDataUrl3,
         max(case when ProductDataLinkTypeId = 4 then ProductDataLinkUrl end) as ProductDataUrl4
  from product_data_links pdl
  where ProductDataId = 99999 and
        ProductDataLinkIsActive = 1 and
        ProductDataLinkTypeId in (1, 2, 3, 4);
Run Code Online (Sandbox Code Playgroud)

您希望此查询的上面的第二个索引.