[英]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.