Левое соединение С WHEN И CASE замедляет выполнение sql-запроса

#mysql #case #sql-query-store

Вопрос:

В моем запросе мне нужно добавить регистр для нескольких условий , но после добавления регистра это замедляет мой запрос , без регистра он занимает максимум 60 мс, но в случае, если он занимает до 700 мс, Я хочу сделать это быстро, потому что он будет работать на всех типах мобильных устройств, таких как 1 ГБ или с 2 ГБ оперативной памяти, и так далее, пожалуйста, направьте меня

запрос с регистром

 SELECT     sku.skuid AS _id ,
           sku.skudescription,
           sku.skushortdescription,
           sku.skucode,
           sku.piecesincarton,
           sku.piecesinvirtualpack,
           sku.invoicepricetodistributor,
           sku.salestaxtodistributor,
           sku.totalpricetodistributor,
           sku.distributorsellingprice,
           sku.retailpriceexcltax,
           sku.salestax,
           sku.totalpriceincltax,
           sku.distributortotalprice,
           sku.distributorsellingpriceur,
           sku.distributorsalestax,
           sku.distributortotalpriceur,
           sku.distributorsalestaxur,
           sku.skuimage,
           sku.skuvariantid,
           sku.skupricepointid,
           sku.skupacksizeid,
           sku.skupacktypeid,
           sku.skuexempted,
           sc.channelid,
           si.remainingpieces,
           sc.sellingpricelevelid,
           sc.distributorid,
           sc.buyingpricelevelid,
           mss.masterskusid,
           mss.manufacturerid,
           mss.businessunitid,
           mss.categoryid,
           mss.brandid,
           ms.typeid,
           top.rank    AS skurank
FROM       skus        AS sku
INNER JOIN skuchannels AS sc
ON         sku.skuid= sc.skuid
AND        sku.distributorid = sc.distributorid
AND        sku.skupricelevelid = sc.sellingpricelevelid
INNER JOIN pjpbrand AS pb
ON         pb.brandid = sku.brandid
INNER JOIN pjp AS p
ON         p.pjpid = pb.pjpid
AND        p.distributorid = sku.distributorid
LEFT JOIN  distributormustsells AS ms
ON         ms.channelid = sc.channelid
LEFT JOIN  distributormustsellskus AS mss
ON
           CASE
                     
                      WHEN ms.typeid = 0 THEN mss.masterskusid = sku.masterskuid
                      WHEN ms.typeid = 1 THEN mss.manufacturerid = sku.manufacturerid
                      WHEN ms.typeid = 2 THEN mss.businessunitid = sku.bussinessunitid
                      WHEN ms.typeid = 3 THEN mss.categoryid = sku.categoryid
                      WHEN ms.typeid = 4 THEN mss.brandid = sku.brandid
                      ELSE mss.skuid = sku.skuid  
           END
LEFT JOIN  topsellingskus AS TOP
ON         top.skuid = sku.skuid
LEFT JOIN  skuinventory AS si
ON         si.skuid = sku.skuid
INNER JOIN obstores AS ob
where      sc.channelid = 9
AND        sku.distributorid = 70000472
AND        ob.storeid = 24177
AND mss.distributorMustSellId = 28437

AND        pb.pjpid = 3357
GROUP BY   sku.skuid
ORDER BY   skurank IS NULL,
           skurank
 

И без дела

 SELECT     sku.skuid AS _id ,
           sku.skudescription,
           sku.skushortdescription,
           sku.skucode,
           sku.piecesincarton,
           sku.piecesinvirtualpack,
           sku.invoicepricetodistributor,
           sku.salestaxtodistributor,
           sku.totalpricetodistributor,
           sku.distributorsellingprice,
           sku.retailpriceexcltax,
           sku.salestax,
           sku.totalpriceincltax,
           sku.distributortotalprice,
           sku.distributorsellingpriceur,
           sku.distributorsalestax,
           sku.distributortotalpriceur,
           sku.distributorsalestaxur,
           sku.skuimage,
           sku.skuvariantid,
           sku.skupricepointid,
           sku.skupacksizeid,
           sku.skupacktypeid,
           sku.skuexempted,
           sc.channelid,
           si.remainingpieces,
           sc.sellingpricelevelid,
           sc.distributorid,
           sc.buyingpricelevelid,
           mss.masterskusid,
           mss.manufacturerid,
           mss.businessunitid,
           mss.categoryid,
           mss.brandid,
           ms.typeid,
           top.rank    AS skurank
FROM       skus        AS sku
INNER JOIN skuchannels AS sc
ON         sku.skuid= sc.skuid
AND        sku.distributorid = sc.distributorid
AND        sku.skupricelevelid = sc.sellingpricelevelid
INNER JOIN pjpbrand AS pb
ON         pb.brandid = sku.brandid
INNER JOIN pjp AS p
ON         p.pjpid = pb.pjpid
AND        p.distributorid = sku.distributorid
LEFT JOIN  distributormustsells AS ms
ON         ms.channelid = sc.channelid
LEFT JOIN  distributormustsellskus AS mss
ON
          mss.skuid = sku.skuid  
LEFT JOIN  topsellingskus AS TOP
ON         top.skuid = sku.skuid
LEFT JOIN  skuinventory AS si
ON         si.skuid = sku.skuid
INNER JOIN obstores AS ob
where      sc.channelid = 9
AND        sku.distributorid = 70000472
AND        ob.storeid = 24177
AND mss.distributorMustSellId = 28437
 
AND        pb.pjpid = 3357
GROUP BY   sku.skuid
ORDER BY   skurank IS NULL,
           skurank
 

Комментарии:

1. без регистра это займет максимум 60 мс, но с регистром это займет до 700 мс, вы можете попробовать: разделить запрос на 6 запросов с одним параметром из функции CASE каждый и ОБЪЕДИНИТЬ ВСЕ; преобразовать РЕГИСТР в 6 выражений в сочетании с ИЛИ. PS. INNER JOIN obstores AS ob не имеет предложения ON — заменить ПЕРЕКРЕСТНЫМ СОЕДИНЕНИЕМ.