SQL: BETWEEN和IN(哪个更快)

5

我认为查询或删除的性能是相同的。 - FrustratedWithFormsDesigner
2
说实话,这种问题无法回答得超出“取决于”。在这里使用between似乎是正确的,但它是否更快?它总是更快吗?在删除数据的情况下考虑它是值得的吗?你有什么DBMS,索引等。只有通过检查,你才能回答这个问题。 - Kobi
5个回答

11
  • 如果您的ID始终是连续的,那么应该使用BETWEEN
  • 如果您的ID可能不是连续的,则使用IN

性能其实不应该成为决定因素。话虽如此,在我测试的所有示例中,BETWEEN似乎都更快。例如:

没有索引的情况下,检查一个有一百万行的表,其中每一行x = 1:

SELECT COUNT(*) FROM table1 WHERE x IN (1, 2, 3, 4, 5, 6);
耗时:0.55秒
SELECT COUNT(*) FROM table1 WHERE x BETWEEN 1 AND 6; 耗时:0.54秒

没有索引的情况下,检查一个有一百万行且x具有唯一值的表:

SELECT COUNT(*) FROM table1 WHERE x IN (1, 2, 3, 4, 5, 6);
耗时:0.65秒
SELECT COUNT(*) FROM table1 WHERE x BETWEEN 1 AND 6; 耗时:0.36秒

但更现实的情况是ID列是唯一且已索引的。当您这样做时,两个查询的性能接近瞬间。

SELECT COUNT(*) FROM table2 WHERE x IN (1, 2, 3, 4, 5, 6);
耗时:0.00秒
SELECT COUNT(*) FROM table2 WHERE x BETWEEN 1 AND 6; 耗时:0.00秒

所以,我会建议集中精力编写清晰的SQL语句,而不必担心执行速度上的微小差异。同时确保表正确地建立了索引,因为这将产生最大的差异。

注意:这些测试是在SQL Server Express 2008 R2上执行的。在其他系统上可能会有所不同。


我有一个惊喜,使用索引而不是另一个索引,在in/between之一中使用索引,两种方式都会使查询突然表现异常(取决于实际值),因为它被处理为full scan而不是逻辑 index scan... - pascal
在大多数情况下,我同意马克的观点,但请注意,当性能是一个因素时,您应该考虑您的索引并对两个选项进行基准测试。在MySQL中,我曾经遇到过使用IN比使用BETWEEN更快的情况。 - Code Commander

4

IN相当于1或2或3或4或5

Between相当于>= 1并且<= 6

个人认为在范围内使用between更好,但特定情况和数据库引擎也可能有所不同。


2
+1,我从不使用between,它是否包括端点?每个人似乎都忘记了,所以我使用>=><=<,这样就清楚地知道是否包括端点。 - KM.
@KM,它包括端点,在两端都是闭合的,而且我个人认为名称不准确。 - CaffGeek
@Chad,谢谢;-)但我说的是everyone seems to forget,而不是我忘了。在英语中,between的意思是指两个物体之间的区域。所以当我说你可以拥有我手中的一切时,我并不是指我的手也包括在内!通过编写代码来包含实际的>=/><=/<,可以清楚地表达您的意图,这有助于更容易理解代码。 - KM.
@KM @CaffGeek,虽然<=和>=更具有描述性,但它们需要您复制操作数,这会增加代码维护的负担,我认为这使查询更难读。我认为可以合理地期望人们知道BETWEEN是包含的,但如果您不知道,我建议在使用BETWEEN时添加内联注释--包含,而不是重复操作数。 - Code Commander
@代码指挥官,你越是使用SQL,就会发现你需要复制代码块的次数越多,但你对此的关注度却越来越低。 - KM.

2

这取决于索引是否已实现。如果id是主键,则两个查询的成本应该相同。使用分析器评估SQL。


1

使用 Between 子句,除非您预计将来的 Id 不同。


0

Between 由于比较次数较少,因此速度更快。 使用 IN 子句时,每个元素都会被遍历。

但两者的目的不同:

  • 当您与某种序列中的值范围进行比较时,会使用 Between。

  • 当与不在序列中的值进行比较时,会使用 IN。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接