【问题标题】:What is an efficient way to do pattern match in MySQL?在 MySQL 中进行模式匹配的有效方法是什么?
【发布时间】:2010-08-26 09:09:50
【问题描述】:

我们在一个查询中有一个巨大的模式匹配(大约 12 个要检查的字符串)。 现在我必须在 MySQL 中做这个查询,但是来自 PostgreSQL 的查询似乎没有相同的语法。

来自 PostgreSQL:

SELECT value  
FROM ...  
WHERE ...  
AND `value` !~* '.*(text|text2|text3|text4|text5).*';  

如何在 MySQL 中高效地执行此操作?我知道,这可能根本没有效率。最有效的方法是什么?

这可以解决问题,但可能是最糟糕的查询:

SELECT `value`  
FROM ...  
WHERE ...  

AND NOT (  
   `value` LIKE '%text%'  
OR `value` LIKE '%text2%'  
OR `value` LIKE '%text3%'  
OR `value` LIKE '%text4%'  
OR `value` LIKE '%text5%');  

REGEXP 是去这里的方式吗?那我就得搞清楚对应的表达方式了。

【问题讨论】:

    标签: mysql postgresql performance pattern-matching sql-like


    【解决方案1】:

    是的,REGEXP 或其替代拼写 RLIKE

    WHERE value NOT RLIKE 'text|text2|text3|text4|text5'
    

    (除非您明确使用^$,否则正则表达式匹配不会锚定到字符串的末尾,因此您不需要.*(...).*。)

    您应该对其进行测试,看看它是否实际上LIKE 的版本快。在我有四个单词的测试数据库中,LIKE 仍然相当快。它还具有 ANSI 标准 SQL 的优势,因此您可以在任何数据库上使用它。

    如果这是一个常见的查询,你还应该考虑全文索引。

    【讨论】:

    • 在这种情况下,NOT (LIKE OR LIKE OR LIKE ...) 比 NOT RLIKE 快 50%。这可能会根据检查的数量而有所不同。感谢您提供所有其他信息!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-07-16
    • 1970-01-01
    • 2015-07-14
    • 2012-12-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多