繁体   English   中英

在联接中使用L​​IKE时的性能问题

[英]Performance issue when using LIKE in joins

我们有一个电子商务网站。 我们给客户信用券。 他可以按1,2 ... n的顺序使用此命令,并进一步放置。 说我们发行了名为“ abcd”的信用凭证。 当他拆分并使用凭单并按顺序使用时,它将进行调整,例如abcd-1等。因此,我试图制作一份报告,其中列出了所有已发行的凭单和使用这些凭单下达的订单。 我写了下面的查询。 它工作正常,但需要花费很多时间来加载。 我可以为表现做些什么?

SELECT *
FROM (creditvouchers)
LEFT JOIN adjustment ON `adjustment`.`code` 
                    LIKE IF((creditvouchers.creditvoucher = ''),
                        creditvouchers.creditvoucher,
                        CONCAT(creditvouchers.creditvoucher,'','%'))

这是桌子

creditvouchers -> id PK, creditvoucher varchar(50)
adjustment     -> id PK, code varchar(50)

这是没有if()查询逻辑:

SELECT *
FROM creditvouchers cv LEFT JOIN
     adjustment a
     ON a.`code` like concat(cv.creditvoucher, '%') and cv.creditvoucher <> '' or
        a.code = '';

MySQL在on子句中or优化联接非常不好。 但是,真正的挑战是这部分:

select *
from creditvouchers cv left join
     adjustment a
     on a.code like concat(cv.creditvoucher, '%') and cv.creditvoucher <> ''

我建议您考虑一下您的数据结构。 我怀疑中间表CreditvoucherCode会对您的系统有所帮助。 每个信用凭证和代码都有一行。

另一种可能性是,如果每个creditvoucher的长度相同,例如4,则可以向包含creditvoucher adjustment中添加另一个字段。

我还建议您为凭证使用数字ID,并在另一个表中使用凭证和订单之间的映射。 在此映射表中,您将仅具有与之匹配的ID,比与LIKE与varchar比较要快得多。

如果您想知道自己进行了哪些调整,只需在表中搜索凭证,然后将其与映射表中的voucher_id一起加入即可。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM