如何在其中使用多个NOT LIKE语句优化AND?

时间:2015-05-15 17:20:09

标签: mysql performance

我无法真正使用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)

1 个答案:

答案 0 :(得分:0)

您仍然看着所有行。

    由于领先的通配符,
  • 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所属的类别

如果每个Note只属于一个类别,则使用ENUM并将其编入索引。如果没有,测试SET将比LIKE或REGEXP快一点。