首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >SQL 'like‘vs '=’性能

SQL 'like‘vs '=’性能
EN

Stack Overflow用户
提问于 2011-05-27 00:55:36
回答 6查看 125K关注 0票数 87

This question 回避了我想知道的问题,但答案并没有确切地解决这个问题。

一般来说,在使用通配符时,'=‘比'like’更快。这似乎是传统的观点。但是,假设我有一个列,其中包含有限数量的不同固定、硬编码的varchar标识符,并且我想选择与其中之一匹配的所有行:

代码语言:javascript
复制
select * from table where value like 'abc%'

代码语言:javascript
复制
select * from table where value = 'abcdefghijklmn'

“‘Like”应该只需要测试前三个字符就可以找到匹配项,而“=”必须比较整个字符串。在这种情况下,在其他条件相同的情况下,在我看来,“like”将具有优势。

这是一个一般性的学术问题,因此与哪个数据库无关,但它是使用SQL Server2005提出的。

EN

回答 6

Stack Overflow用户

发布于 2011-05-27 00:59:47

您还应该记住,在使用like时,某些类型的sql会忽略索引,这会降低性能。如果您不像您的示例那样使用“以”开头“模式,这一点尤其正确。

你真的应该看看查询的执行计划,看看它在做什么,尽量少猜测。

这就是说,“开始于”模式可以并且在sql server中得到优化。它将使用表索引。出于这个原因,EF 4.0切换到了StartsWithlike

票数 13
EN

Stack Overflow用户

发布于 2011-05-27 01:02:58

如果value未编入索引,则两者都会导致表扫描。这种情况下的性能差异可以忽略不计。

如果value被索引,正如丹尼尔在他的评论中指出的那样,=将导致O(log )性能的索引查找。LIKE将(最有可能-取决于它的选择性)导致索引>= 'abc'< 'abd'的部分扫描,这将需要比=更多的工作。

请注意,我在这里谈论的是SQL Server -并不是所有的DBMS都适合使用LIKE。

票数 7
EN

Stack Overflow用户

发布于 2015-02-19 22:56:11

一个使用MySQL5.5的个人示例:我在两个表之间进行了一个内部连接,一个是300万行,另一个是10000行。

在如下所示的索引上使用like (无通配符)时,大约需要30秒:

代码语言:javascript
复制
where login like '12345678'

使用'explain‘我得到:

当对同一查询使用'=‘时,大约需要0.1秒:

代码语言:javascript
复制
where login ='12345678'

使用'explain‘我得到:

如您所见,like完全取消了索引查找,因此查询时间增加了300倍。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6142235

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档