Mysql 正在寻找更好的解决方案-使用类型字符串比较的AND运算符的长列表

Mysql 正在寻找更好的解决方案-使用类型字符串比较的AND运算符的长列表,mysql,sql,Mysql,Sql,我有搜索功能,可以在一个大的mysql表中搜索关键字,但是由于我需要过滤掉所有的坏单词,我必须在mysql中进行以下类型的a和比较,这是一个很长的禁止单词列表(超过500+),因为它非常慢 SELECT * FROM keywords WHERE 1 AND keyword NOT LIKE '%love%' AND keyword NOT LIKE '%hope%' AND keyword NOT LIKE '%caring%' AND keyword NO

我有搜索功能,可以在一个大的mysql表中搜索关键字,但是由于我需要过滤掉所有的坏单词,我必须在mysql中进行以下类型的a和比较,这是一个很长的禁止单词列表(超过500+),因为它非常慢

SELECT * FROM keywords WHERE 1  
    AND keyword NOT LIKE '%love%'
    AND keyword NOT LIKE '%hope%'
    AND keyword NOT LIKE '%caring%'
    AND keyword NOT LIKE '%x%'
    AND keyword NOT LIKE '%happiness%'
    AND keyword NOT LIKE '%forgiveness%'
    AND keyword NOT LIKE '%good%'
    AND keyword NOT LIKE '%great%'
    AND keyword NOT LIKE '%positive%'
    AND keyword NOT LIKE '%sharing%'
    AND keyword NOT LIKE '%awesome%'
    AND keyword NOT LIKE '%fantastic%' 

还有其他更好的方法吗?

像使用
模式匹配一样使用
模式匹配会有糟糕的性能,因为无法使用索引。使用@fuzic这样的正则表达式更糟糕

如果您想要良好的性能,您确实需要使用一些全文索引解决方案

我在演示文稿中介绍了这一点,并比较了几种解决方案



简单的回答是:使用。

你可以做得比构建一个识别完整字符串集的有限状态机更糟糕。手工编写一个代码会很乏味,但幸运的是,诸如LEX及其后代和kin之类的工具已经存在了近40年,用于自动化该过程。

您可以通过一个regexp检查来实现这一点。。。我不确定性能差异。regexp速度很慢,我不能输入,但问题是我不能使用%%,我想嗨,比尔,爱你的书。我同意你关于LIKE和RegExp是一个糟糕的解决方案的说法。你介意为OP提出更好的解决方案吗?太好了。。我用自然语言尝试了myisam的全文解决方案,它将查询时间从5.0秒减少到了0.3秒。。。但是,如果我添加ORDER BY RAND()或GROUP BY,它将再次返回到2.8s。我可以通过使用DISTINCT关键字来处理这个组,但并没有解决RAND()问题的方法,对此有什么想法吗?顺便说一句,使用全文的innodb解决方案不起作用,它认为innodb仍处于实验阶段。。。。