BETWEEN
。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
... - pascalIN
比使用BETWEEN
更快的情况。 - Code CommanderIN相当于1或2或3或4或5
Between相当于>= 1并且<= 6
个人认为在范围内使用between更好,但特定情况和数据库引擎也可能有所不同。
>=
或>
与<=
或<
,这样就清楚地知道是否包括端点。 - KM.everyone seems to forget
,而不是我忘了。在英语中,between
的意思是指两个物体之间的区域。所以当我说你可以拥有我手中的一切时,我并不是指我的手也包括在内!通过编写代码来包含实际的>=
/>
和<=
/<
,可以清楚地表达您的意图,这有助于更容易理解代码。 - KM.BETWEEN
是包含的,但如果您不知道,我建议在使用BETWEEN
时添加内联注释--包含
,而不是重复操作数。 - Code Commander这取决于索引是否已实现。如果id是主键,则两个查询的成本应该相同。使用分析器评估SQL。
使用 Between 子句,除非您预计将来的 Id 不同。
Between 由于比较次数较少,因此速度更快。 使用 IN 子句时,每个元素都会被遍历。
但两者的目的不同:
当您与某种序列中的值范围进行比较时,会使用 Between。
当与不在序列中的值进行比较时,会使用 IN。
between
似乎是正确的,但它是否更快?它总是更快吗?在删除数据的情况下考虑它是值得的吗?你有什么DBMS,索引等。只有通过检查,你才能回答这个问题。 - Kobi