我正在使用MySQL。我问了一个关于如何在数据库中查询a single word match here的问题。
有一个答案建议我使用REGEXP '[[:<:]]word[[:>:]]'
这是一个很好的答案,但是,从性能角度来看,我不确定这个REGEXP '[[:<:]]word[[:>:]]'
是什么?如果我有一个大表,这会损害我的应用程序的性能吗?
例如,与=
操作进行比较,例如WHERE column_name='value'
,REGEXP
操作比大型桌子的=
慢得多吗?
还有另一个答案建议我使用LIKE,但我认为从性能的角度来看并不好。
然后,我用Google搜索并找到article,其中使用LIKE
甚至比REGEXP
更快。我感到困惑,我应该在大表中使用哪种方式进行单词匹配查询......
我可以说,=
是最快的操作,然后是LIKE
,而REGEXP
是性能方面最差的操作吗?
答案 0 :(得分:37)
关于regexp
正则表达式可以从不在MySQL中使用索引
如果符合=
将使用索引:
考虑到这些以及其他一些更深奥的警告,=
比较
关于
如果通配符不是第一个char,则LIKE可以使用索引。
SELECT * FROM t WHERE a LIKE 'abc' <<-- (case insensitive `=`) can use an index
SELECT * FROM t WHERE a LIKE 'abc%' <<-- can use an index
SELECT * FROM t WHERE a LIKE 'a%' <<-- can use an index, depending on cardinality
SELECT * FROM t WHERE a LIKE '%a%' <<-- cannot use an index
SELECT * FROM t WHERE a LIKE '_agf' <<-- cannot use an index
使用索引时like
的性能非常接近=
(假设返回的行数相同)。
答案 1 :(得分:0)
还有另一种搜索数据的方式:Full-Text Search。
它可以在like
,=
不够(执行时间)时使用,另一方面,Sphinx,Lucene太强大了。
要使用它,您应该在列上创建全文索引并进行查询。如果您将使用它,请注意ft_min_word_len
,ft_max_word_len
系统变量,以减少最小/最大字数。
希望它有所帮助。
你的问题的其余部分由@Johan回答。