Mysql 在联接中使用LIKE时出现性能问题
我们有一个电子商务网站。我们给顾客信用凭证。他可以在1,2…n个订单中使用这个,并进一步下订单。 假设我们发行了名为“abcd”的贷记凭证。当他拆分并使用凭证并按顺序使用时,它将进行调整,如abcd-1等。因此,我试图制作一份报告,列出所有已发行的贷记凭证以及使用这些凭证下的订单。我写了下面的查询。它工作得很好,但加载需要很多时间。我能为表演做些什么吗Mysql 在联接中使用LIKE时出现性能问题,mysql,performance,join,Mysql,Performance,Join,我们有一个电子商务网站。我们给顾客信用凭证。他可以在1,2…n个订单中使用这个,并进一步下订单。 假设我们发行了名为“abcd”的贷记凭证。当他拆分并使用凭证并按顺序使用时,它将进行调整,如abcd-1等。因此,我试图制作一份报告,列出所有已发行的贷记凭证以及使用这些凭证下的订单。我写了下面的查询。它工作得很好,但加载需要很多时间。我能为表演做些什么吗 SELECT * FROM (creditvouchers) LEFT JOIN adjustment ON `adjustment`.`cod
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()
的查询逻辑:
我建议您考虑一下您的数据结构。我怀疑中间表,CreditvoucherCode
会对您的系统有所帮助。每个信用凭证和代码将有一行
另一种可能性是,如果每个
贷记凭证的长度相同,例如4,然后,您可以向调整
中添加另一个字段,该字段包含贷记凭证
我还建议您为凭证使用一个数字id,并在另一个表中提供凭证与订单之间的映射。在这个映射表中,您将只拥有要匹配的ID,它比使用LIKE进行varchar比较快得多
如果您想知道您进行了哪些调整,只需在表中搜索凭证,并将其与映射表中的凭证id联接。保留一列,其中包含真实的creditvoucher
(abcd
)与其加入类似的abcd-1
?@h2oooooooo-我不清楚你在暗示什么,为什么每个人每次都使用类似的,为什么你不试试呢。它比比如@Pramod快-我正在使用INODBengine@Hacker阅读在最新版本中,innodb还支持全文搜索。
SELECT *
FROM creditvouchers cv LEFT JOIN
adjustment a
ON a.`code` like concat(cv.creditvoucher, '%') and cv.creditvoucher <> '' or
a.code = '';
select *
from creditvouchers cv left join
adjustment a
on a.code like concat(cv.creditvoucher, '%') and cv.creditvoucher <> ''