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

时间:2014-04-29 11:04:27

标签: mysql performance join

我们有一个电子商务网站。我们为客户提供信用券。他可以在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)

2 个答案:

答案 0 :(得分:1)

以下是没有if()的查询逻辑:

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

MySQL在or子句中使用on优化连接非常糟糕。然而,真正的挑战是这一部分:

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

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

另一种可能性是,如果每个creditvoucher具有相同的长度,例如4,那么您可以向包含adjustment的{​​{1}}添加另一个字段。

答案 1 :(得分:0)

我还建议您使用数字ID作为凭证,使用另一个表格来获取凭证和订单之间的映射。在这个映射表中,你只能匹配id,这比使用LIKE的varchar比较要快得多。

如果您想知道自己有哪些调整,只需在表格中搜索优惠券,然后将其与映射表中的voucher_id联系起来。