mysql - 在 MySQL 中进行模式匹配的有效方法是什么?

标签 mysql postgresql performance pattern-matching sql-like

我们在一个查询中有一个巨大的模式匹配(大约 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 是去这里的方式吗?那我就得想出对应的表达式了。

最佳答案

是的,REGEXP 或其替代拼写 RLIKE:

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

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

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

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

关于mysql - 在 MySQL 中进行模式匹配的有效方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3573637/

相关文章:

linux - Linux VM 上的 Redis BGSAVE

sql - ALTER TABLE 不锁定表?

php - 如何通过php从数据库中获取特定字段

ruby-on-rails - windows环境无法识别postgres 'psql'命令

sql - 获取去年的数字

ruby - 在 ruby​​ 中使用单引号与双引号相比有性能提升吗?

performance - Windows Mobile 6/6.5 性能监控

php - MySQL IN() 函数不起作用

MySql 根据其他列值查询求和行

sql - 使用窗口函数确定 PostgreSQL 中的 30 天运行计数