2010-04-29 95 views
21

有传言说,这个:性能正则表达式的VS LIKE在MySQL查询

SELECT * FROM lineage_string where lineage like '%179%' and lineage regexp '(^|/)179(/|$)' 

会比这个速度更快:

SELECT * FROM lineage_string where lineage regexp '(^|/)179(/|$)' 

谁能证实?或者知道一个体面的方式来测试这种查询的速度。 谢谢

+0

根据这个不太受支持的博客文章,LIKE比REGEXP快10倍(数据可能有所不同,索引使用上没有任何字词等):http://thingsilearn.wordpress.com/2008/02/28/mysql-query -speed-regexp-vs-like/ – 2010-04-29 19:14:23

+0

额外的链接 - 同样的故事,LIKE更快:http://lists.mysql.com/mysql/101728 – 2010-04-29 19:16:26

+0

它'TEXT'和'VARCHAR'字段肯定更快我试过了上。我记得在博客评论中看到** REGEXP **对于'UNSIGNED'字段比** LIKE **快,但我无法证实这一点。 – inhan 2012-08-16 03:24:54

回答

21

它可能会更快,因为可以更快速地评估LIKE条件,然后正则表达式,因此如果大多数行失败,测试可能会更快。但是,如果大多数行都成功了,那么它将会变慢,因为必须为成功的行而不是仅仅一次运行两个测试。它也取决于优化器选择先运行哪个表达式。

一个更大的加速可以,如果你有这样的事情被目击:

SELECT * FROM (
    SELECT * FROM lineage_string 
    WHERE lineage LIKE '179%' 
) WHERE lineage regexp '^179(/|$)' 

现在的指数可以用来寻找可能行,因为LIKE“179%”是sargable。许多行根本不需要检查。

一如既往,最好的方法就是根据您的实际数据自行测量。

13

是的,它可能会快一点点,因为标准SQL LIKE比完整正则表达式解析器更简单的比较操作。

但是,实际上两者都很慢,因为它们都不能使用索引。 (LIKE可以使用索引如果匹配字符串不是以一个通配符开始,但这里并非如此。)

如果您担心速度,你应该改变你的架构,这样就可以直接把179在列和索引中,而不必在每一行上手动检查字符串。