使用“=”和“LIKE”之间有什么性能差异吗?

时间:2011-05-23 02:12:05

标签: php mysql sql

首先,我想提一下,我试过谷歌搜索无济于事。

我想在我的所有列中使用通配符。因此,我希望我的所有SELECT语句都使用LIKE代替=。让我指出我的应用程序中有 NO 用户输入数据,这排除了注入攻击的任何问题。

如果查询的其余部分保持相同,两者之间是否存在速度差异? (也就是说,如果条件的右侧不包含通配符。)

4 个答案:

答案 0 :(得分:2)

任何体面的DBMS都应检测like中的非通配符字符串,并将其视为与=完全相同。但即便进行这项检查也需要一些时间,但不过很小。

如上所述,为此所花费的时间将是最小的,并且每次查询只会发生一次。您真正需要注意的那些性能问题是每行产生成本的问题,例如select to_lower(column_name)。换句话说,您可能不需要关心自己的特定情况。

如果 使用了通配符,那么它几乎肯定会更慢,只是因为你必须检查部分列。像like 'xyz%'这样的子句不会太慢,但除了字符串末尾以外的任何地方的通配符都会导致更严重的问题。

但是,如果你 使用通配符,你就没有选择 - like是唯一的可能性。

结论:除非您的DBMS已经死亡,否则非通配符字符串的=like之间的差异将是微不足道的。

但是,与所有数据库优化一样:测量,不要猜测!


仍然对你问题的一个方面感到困惑。你说:

  

我要指出我的应用程序中没有用户输入数据。

我假设是为了确保我们无法进行SQL注入攻击。

但正因为如此,你必须事先知道(在代码中)查询是通配符还是非通配符。在这种情况下,为什么不在适当情况下使用=变体并消除所有疑问。

如果您在评论中说明没有通配符查询,为什么您甚至会考虑使用like

答案 1 :(得分:2)

没有区别。

WHERE名字'Fred'

明显不同

WHERE firstname ='Fred'

所以你在所有情况下都可以自由地使用“LIKE”而不是“=” 希望存在通配符来控制是否存在 调用通配符搜索。

我找不到参考文献,但我已经不止一次地看过这个,并且它 说得通。索引策略在任何一种方式都是等效的(它只能匹配 同一个索引上的相同字符)我有时会写这个查询 因为特定调用中存在或不存在通配符是可以接受的。 此外,我从未见过有人试图解析野外存在的情况 字符并根据具体情况以不同方式调用SQl。它也许会 这样做有风险,因为用错误的表达式编写效率低下的(unSARGable)查询会更容易。

答案 2 :(得分:0)

是的,虽然有多少取决于。

如果列被索引,那么它可能会慢一点。特别是如果你比较像'%suffix'这样的东西,因为当百分号出现在搜索字符串的开头时,根本无法使用索引。

答案 3 :(得分:0)

@Jonathan Wood说的是什么。例如,当您询问MySQL使用通配符'%'查找值时,服务器必须读取整个表中的每一行以查找匹配项。