【问题标题】:How can I optimize an AND with multiple NOT LIKE statements inside of it?如何优化 AND 与其中的多个 NOT LIKE 语句?
【发布时间】:2015-07-27 17:17:03
【问题描述】:

我不能真正使用 IN 语句,因为在我的情况下通配符是非常必要的。任何帮助表示赞赏。

AND ((NOT (j.Note LIKE '%audit%'
            OR j.Note LIKE '%discrepancy%'
            OR j.Note LIKE '%returns%'
            OR j.Note LIKE '%shipment error%'
            OR j.Note LIKE '%inventory adjustment%'))
            OR j.Note IS NULL)

【问题讨论】:

  • REGEXP 也许?不确定它实际上会更好。
  • 你能改进你的数据结构吗?如果您有单独的列来跟踪给定行是否为审计、差异、返回等,您的查询会变得更加简单。值为 1 表示真和 0 表示假的 Tinyint 列就足够了。
  • @GeorgeCummins 这可能是最好的答案,但如果我们假设我无法修改数据结构,我仍然很好奇是否还有其他方法。
  • @NagasimhaIyengar 这与我当前的查询相同。它的问题是它的性能不是很好。

标签: mysql performance


【解决方案1】:

您一直在查看所有行。

  • LIKE '%...' 不能使用索引,因为前导通配符
  • REGEXP 可以一次完成所有测试,而不是多次 LIKEs,所以它可能会更快
  • AND NOT (...) 没有帮助
  • OR 没有帮助
  • FULLTEXT 不能很有帮助,因为是“阴性”测试。

我推荐这个:

AND j.Note IS NOT NULL
AND j.Note REGEXP 'audit|discrepancy|returns|shipment error|inventory adjustment'

如果Note 有很多NULLs,那么INDEX(Note) 可以通过避免NULLs 来提供帮助。

这是另一种方法:当您插入行时,将它们归类为“审计”或...然后有另一列(可能是SET)来标记每个注释所属的类别。

如果每个 Note 只属于一个类别,则使用 E​​NUM 并对其进行索引。如果没有,测试 SET 会比 LIKE 或 REGEXP 快一点。

【讨论】:

  • 我会选择此作为最佳答案,但在我的示例中,j.Note 可以是 NULLAND j.Note NOT LIKE 'audit|discrepancy|returns|shipment error|inventory adjustment',所以可能是:AND j.Note NOT REGEXP 'audit|discrepancy|returns|shipment error|inventory adjustment' OR j.Note IS NULL
  • 小心a AND b OR c -- 这意味着(a AND b) OR c不是 a AND (b OR c)
猜你喜欢
  • 1970-01-01
  • 2021-01-23
  • 2021-05-04
  • 2020-01-06
  • 1970-01-01
  • 2012-10-17
  • 1970-01-01
  • 2013-05-16
  • 1970-01-01
相关资源
最近更新 更多