mysql 使用替换函数的查询非常慢

siv3szwd  于 2023-03-22  发布在  Mysql
关注(0)|答案(1)|浏览(114)

我对我的mysql查询有疑问,它非常非常慢。

SELECT s0_.sku                                                                                           AS sku_2,
       (SELECT count(s1_.id) AS sclr_45
        FROM store_product s1_
        WHERE s1_.sku IS NOT NULL AND s1_.sku <> '' AND s1_.store_id = s0_.store_id AND s1_.sku = s0_.sku
           OR s1_.sku = REPLACE(REPLACE(REPLACE(REPLACE(s1_.sku, '-', ''), '.', ''), '/', ''), ' ', '')) AS sclr_44
FROM store_product s0_
WHERE s0_.store_id = 5
GROUP BY s0_.id
HAVING sclr_44 > 5
ORDER BY s0_.sku ASC

特别是这部分OR s1_.sku = REPLACE(REPLACE(REPLACE(REPLACE(s1_.sku, '-', ''), '.', ''), '/', ''), ' ', '')) AS sclr_44
如果我删除它,查询速度很快。我需要使用替换函数,因为我想显示所有重复的sku,如111和11.1,它们是相同的,因为替换函数删除了点。
如何提高性能?现在在本地数据库上,查询已经执行超过一分钟..如果我删除替换,时间小于1秒。
在主选择中有更多的列
编辑;
我的解释计划

**

**

zz2j4svz

zz2j4svz1#

您可能希望将“replaced”字段与s0_.sku进行比较,而不是与其本身(s1_.sku)进行比较。

  • 将其与s0_.sku进行比较
SELECT s0_.sku AS sku_2
  (
     SELECT 
       count(s1_.id) AS sclr_45
     FROM 
       store_product s1_
     WHERE 
       s1_.sku IS NOT NULL AND 
       s1_.sku <> '' AND 
       s1_.store_id = s0_.store_id AND 
       ( 
          s1_.sku = s0_.sku OR 
          s0_.sku = REPLACE(REPLACE(REPLACE(REPLACE(s1_.sku, '-', ''), '.', ''), '/', ''), ' ', '')
       )
  ) AS sclr_44

  FROM store_product s0_
  WHERE s0_.store_id = 5
  GROUP BY s0_.id
  HAVING sclr_44 > 5

祝你好运

相关问题