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