假设我有一个带有记录的列'x':'one two hello five'。 我想搜索一个特定的单词(f.e.'hello'),如果它存在 - 作为结果给出这个记录。
还有其他选项,它会在给定列中搜索确切的单词,但不像正则表达式那么慢吗?
答案 0 :(得分:4)
如果您想要速度,请使用全文搜索索引。如果列包含由空格分隔的标记,那么您的数据结构错误,需要另一个表。
假设一致的单词分隔符,您可以使用like
执行所需的操作:
where concat(' ', x, ' ') like '% hello %'
但这不会比正则表达式版本快得多。正则表达式版本更通用,因为它允许更多的单词分隔符。
答案 1 :(得分:0)
你试过了吗?
SELECT (...) WHERE x LIKE '% hello %
hello
两侧有空格?
答案 2 :(得分:0)
尝试使用
SELECT (...) WHERE x LIKE '% hello %' or x LIKE 'hello %' or x LIKE '% hello'
答案 3 :(得分:0)
通常,对于这样的用例,您应该考虑MySQL是否是该作业的最佳数据库。您可以搜索%hello%
或其他人建议您可以使用正则表达式。但是你必须意识到,与实际上让你搜索文本的其他数据库相比,这些都会变慢。
您的下一个选择是使用match(column) against ('hello')
,如果您拥有最新版本,则可以使用fulltext search。
您最好的选择是真正评估您的用例。如果这是针对少量数据,则上述任何一项都可能有效。但是,如果您有数百万个文档和数百万个事务,那么您最好的选择是使用像Elasticsearch这样的东西,它使用Lucene索引单词。
答案 4 :(得分:0)
你是对的,使用REGEXP
的速度很慢,因此LIKE
使用通配符也是如此。
全文索引可以很好地解决您的要求。这是MySQL内置的一个功能:Full-Text Search Functions,或者您可以使用Apache Solr或Sphinx Search等工具独立索引数据。
您可能会发现我在比较MySQL的不同全文搜索解决方案时所做的演示。
答案 5 :(得分:0)
new
说明:
WHERE x LIKE '%hello%'
HAVING x RLIKE '[[:<:]]hello[[:>:]]'
速度更快,但会获得一些您不想要的行。LIKE
仅适用于LIKE过滤的那些,因此它的迟缓不是太大的问题。(是的,RLIKE
会更快。)