REGEXP性能(与"LIKE"和"="相比)

Mel*_*lon 17 mysql sql database

我正在使用MySQL.我问了一个关于如何在数据库中查询单个单词匹配的问题.

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

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

例如,与=操作进行比较,例如WHERE column_name='value',REGEXP操作是否比=大表慢得多?

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

    然后,我用Google搜索,发现了一个文章它说用LIKE甚至更快的REGEXP.我感到困惑,我应该在大表中使用哪种方式进行单词匹配查询...

我可以说,那=是最快的操作吗?从性能角度看LIKE,它REGEXP是最差的吗?

Joh*_*ica 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
Run Code Online (Sandbox Code Playgroud)

like使用索引时的性能非常接近=(假设返回的行数相同).