REGEXP性能(与“LIKE”和“=”相比)

时间:2011-11-16 14:30:38

标签: mysql sql database

我正在使用MySQL。我问了一个关于如何在数据库中查询a single word match here的问题。

  • 有一个答案建议我使用REGEXP '[[:<:]]word[[:>:]]'

    这是一个很好的答案,但是,从性能角度来看,我不确定这个REGEXP '[[:<:]]word[[:>:]]'是什么?如果我有一个大表,这会损害我的应用程序的性能吗?

例如,与=操作进行比较,例如WHERE column_name='value'REGEXP操作比大型桌子的=慢得多吗?

  • 还有另一个答案建议我使用LIKE,但我认为从性能的角度来看并不好。

    然后,我用Google搜索并找到article,其中使用LIKE甚至比REGEXP 更快。我感到困惑,我应该在大表中使用哪种方式进行单词匹配查询......

我可以说,=是最快的操作,然后是LIKE,而REGEXP是性能方面最差的操作吗?

2 个答案:

答案 0 :(得分:37)

关于regexp

正则表达式可以从不在MySQL中使用索引 如果符合=将使用索引:

  • 在列上声明索引;
  • 列中的值具有足够的基数(如果超过+/- 20%的行匹配,MySQL将不使用索引,因为在这种情况下,执行全表扫描更快 );
  • 同一个表上没有其他索引更适合(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_lenft_max_word_len系统变量,以减少最小/最大字数。

希望它有所帮助。

你的问题的其余部分由@Johan回答。