首先,我想提一下,我试过谷歌搜索无济于事。
我想在我的所有列中使用通配符。因此,我希望我的所有SELECT
语句都使用LIKE
代替=
。让我指出我的应用程序中有 NO 用户输入数据,这排除了注入攻击的任何问题。
如果查询的其余部分保持相同,两者之间是否存在速度差异? (也就是说,如果条件的右侧不包含通配符。)
答案 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使用通配符'%'查找值时,服务器必须读取整个表中的每一行以查找匹配项。