首先,我想提一下,我试着谷歌搜索这个无济于事。使用“=”和“LIKE”有什么不同吗?
我想在我的所有列中使用通配符的选项。因此,我希望我所有的SELECT
对帐单都使用LIKE
而不是=
。让我指出在我的应用程序中有用户输入数据,这排除了注入攻击的任何问题。
如果查询的其余部分保持不变,两者之间是否存在速度差异? (也就是说,如果条件的右侧不包含通配符)。
首先,我想提一下,我试着谷歌搜索这个无济于事。使用“=”和“LIKE”有什么不同吗?
我想在我的所有列中使用通配符的选项。因此,我希望我所有的SELECT
对帐单都使用LIKE
而不是=
。让我指出在我的应用程序中有用户输入数据,这排除了注入攻击的任何问题。
如果查询的其余部分保持不变,两者之间是否存在速度差异? (也就是说,如果条件的右侧不包含通配符)。
没有区别。
WHERE姓LIKE '弗雷德'
是不是从
感知不同的WHERE姓名= '弗雷德'
所以,你可以自由地使用 “LIKE”, “=”,在所有的,而不是 需要存在通配符来控制是否要 调用通配符搜索。
我找不到参考,但我已经看到这个不止一次提到,它是 是有道理的。索引策略将等同于任何一种方式(它只能匹配 相同索引上的相同字符),并且我有时会以这种方式编写查询,因为在特定调用中存在或不存在通配符是可以接受的。 另外,我从来没有见过某个人试图解析出存在一个狂野的角色,并根据情况不同地调用SQ1的情况。这样做可能会带来风险,因为使用错误的表达式编写低效(unSARGable)查询会更容易。
是的,虽然有多大依赖。
如果列被索引,那么它可能会慢很多。特别是如果您比较类似'%suffix'
之类的内容,因为百分号出现在搜索字符串的开头时,索引根本无法使用。
我的问题指定“如果查询的其余部分保持相同”。你能编辑吗? – Hubro 2011-05-23 02:15:45
任何像样的DBMS都应该在like
中检测到一个非通配符字符串,并将它看作与=
完全相同。但即使这样检查也需要一些时间,但无论如何都是微不足道的。
如上所述,这样做的时间会很短,并且每个查询只会发生一次。 真的需要注意的性能问题是每行产生成本的东西,比如select to_lower(column_name)
。换句话说,你可能不需要关心你的具体情况。
如果你有使用通配符,那么它几乎肯定会变慢,只是因为你必须检查部分列。像like 'xyz%'
这样的子句不会太慢,但是在字符串末尾以外的任何地方都可能导致更严重的问题。
但是,如果您使用通配符为,则不会有选项 - like
将是唯一的可能性。底线:除非您的DBMS死脑筋,=
和like
之间的非通配符字符串之间的差异将是微不足道的。
但是,如同所有数据库优化:措施,不要猜测!
我做仍然受到你的问题的一个方面,虽然混淆。您声明:
让我指出在我的应用程序中没有用户输入数据。
我假设我们确保SQL注入攻击是不可能的。
但是因为这个原因,你一定会事先知道(在代码中)查询是通配符还是非通配符。在这种情况下,为什么不恰当地在适当的地方使用=
变体,并消除所有疑问。
如果,你在评论中注明,有没有通配符查询,你为什么会连使用like
考虑。
@Jonathan Wood说了些什么。例如,当您询问MySQL时,要使用通配符'%'查找值,服务器必须读取整个表中的每一行以查找匹配项。
没有人读过这个问题吗?我隐式指定“如果查询的其余部分保持相同”。没有通配符。 – Hubro 2011-05-23 02:23:18
@Codemonkey,我们读了这个问题。你明确表示“我想要使用通配符”。这似乎是面对上面的“无通配符”评论。这是什么? – paxdiablo 2011-05-23 02:29:41
好的,让我澄清一下:99.99%的'SELECT'查询将没有通配符。这是我担心的99.99%的查询的表现。我想知道,仅仅使用'LIKE'而不是'='的性能影响是否可以向包含输入和不包含任何通配符的区分添加代码。 – Hubro 2011-05-23 02:35:26
s /不是/不应该/ – 2011-05-23 02:35:35
s /不是/不是基于实际测试/ – dkretz 2011-05-23 02:40:17
参考资料:http://use-the-index-luke.com/sql/where-clause/searching-for-范围/类似性能调整 – 2011-05-23 06:20:41