This question 回避了我想知道的问题,但答案并没有确切地解决这个问题。
一般来说,在使用通配符时,'=‘比'like’更快。这似乎是传统的观点。但是,假设我有一个列,其中包含有限数量的不同固定、硬编码的varchar标识符,并且我想选择与其中之一匹配的所有行:
select * from table where value like 'abc%'
和
select * from table where value = 'abcdefghijklmn'
“‘Like”应该只需要测试前三个字符就可以找到匹配项,而“=”必须比较整个字符串。在这种情况下,在其他条件相同的情况下,在我看来,“like”将具有优势。
这是一个一般性的学术问题,因此与哪个数据库无关,但它是使用SQL Server2005提出的。
发布于 2011-05-27 00:59:47
您还应该记住,在使用like
时,某些类型的sql会忽略索引,这会降低性能。如果您不像您的示例那样使用“以”开头“模式,这一点尤其正确。
你真的应该看看查询的执行计划,看看它在做什么,尽量少猜测。
这就是说,“开始于”模式可以并且在sql server中得到优化。它将使用表索引。出于这个原因,EF 4.0切换到了StartsWith
的like
。
发布于 2011-05-27 01:02:58
如果value
未编入索引,则两者都会导致表扫描。这种情况下的性能差异可以忽略不计。
如果value
被索引,正如丹尼尔在他的评论中指出的那样,=
将导致O(log )性能的索引查找。LIKE将(最有可能-取决于它的选择性)导致索引>= 'abc'
和< 'abd'
的部分扫描,这将需要比=
更多的工作。
请注意,我在这里谈论的是SQL Server -并不是所有的DBMS都适合使用LIKE。
发布于 2015-02-19 22:56:11
一个使用MySQL5.5的个人示例:我在两个表之间进行了一个内部连接,一个是300万行,另一个是10000行。
在如下所示的索引上使用like (无通配符)时,大约需要30秒:
where login like '12345678'
使用'explain‘我得到:
当对同一查询使用'=‘时,大约需要0.1秒:
where login ='12345678'
使用'explain‘我得到:
如您所见,like
完全取消了索引查找,因此查询时间增加了300倍。
https://stackoverflow.com/questions/6142235
复制相似问题