【问题标题】:SQL efficiency - [=] vs [in] vs [like] vs [matches]SQL 效率 - [=] vs [in] vs [like] vs [matches]
【发布时间】:2026-01-31 15:10:01
【问题描述】:

出于好奇,我想知道使用 [=] 与 [in] 与 [like] 与 [matches] 的速度/效率是否存在差异(仅 1 个值) sql语法。

select field from table where field = value;

select field from table where field in (value);

select field from table where field like value;

select field from table where field matches value;

【问题讨论】:

  • 还可以添加:select field from table where field is value;

标签: sql syntax performance


【解决方案1】:

我将添加 也存在子查询

但性能取决于给定 SQL 引擎的优化器。

在 oracle 中,IN 和 EXISTS 之间有很多区别,但在 SQL Server 中则不一定。

您必须考虑的另一件事是您使用的列的选择性。一些案例表明 IN 更好。


但您必须记住,INnon-sargable(不能搜索参数),因此它不会使用索引来解析查询, LIKE=sargable 并支持索引


最好的?您应该花一些时间在您的环境中对其进行测试

【讨论】:

  • Damian 之后似乎改变了主意,相信 IN 是 Sargable:*.com/a/3407657/1028186 我自己在 SQL Server 2017 中测试了这个,使用 IN 和 with = 的查询都使用集群返回了相同的查询计划索引搜索。它仅使用 NOT IN 才进行扫描。
【解决方案2】:

任何关于什么会更快的问题的最佳做法是衡量。 SQL 引擎是出了名的难以预测。您可以查看 EXPLAIN PLAN 的输出来了解它,但最后,只有衡量真实数据的性能才能告诉您您需要了解的内容。

理论上,SQL 引擎可以完全相同地实现所有这三个,但它们可能不会。

【讨论】:

    【解决方案3】:

    通常当有多个要比较的值时使用“in”语句。引擎遍历每个值的列表以查看是否匹配。如果只有一个元素,那么与“=”语句在时间上没有区别。

    “like”表达式的不同之处在于它使用模式匹配来找到正确的值,因此需要在后端做更多的工作。对于单个值,不会有显着的时间差异,因为您只有一个可能的匹配项,并且比较将与“=”和“in”发生的比较类型相同。

    基本上没有,或者至少差异微不足道,以至于您不会注意到。

    【讨论】:

      【解决方案4】:

      这取决于底层的 SQL 引擎。例如在 MS-SQL 中(根据查询计划器输出),IN 子句被转换为 =,因此没有区别

      【讨论】: