索引二进制列是否会提高SQL WHERE BETWEEN语句的性能?

时间:2010-04-09 22:03:00

标签: sql

我有一个表,其中包含表示IP地址数据的二进制列。其中一个查询对该二进制列执行BETWEEN比较。

如果我索引该列,那么SQL语句中BETWEEN比较的性能会提高吗?

3 个答案:

答案 0 :(得分:5)

在这个例子中......

SELECT * FROM MyTable WHERE BinaryCol BETWEEN x and y
  • SELECT *可能意味着忽略了索引,尤其是当x / y覆盖表的很大一部分时
  • 如果x / y非常有选择性,那么它会导致聚集索引bookmark/RID lookup (especially SQL Server)
  • 这适用于单独使用BinaryCol的索引或覆盖

这是这个例子......

SELECT BinaryCol, AnotherCol, YetAnotherCol FROM MyTable WHERE BinaryCol BETWEEN x and y
  • 包含AnotherCol和YetAnotherCol的BinaryCol索引将为covered,很可能会使用索引
  • 如果x / y覆盖了表的很大一部分,那么可能不是

不幸的是,“这取决于”

答案 1 :(得分:2)

一般来说,像这样的问题只能通过在特定数据库和数据集上进行尝试来解决。查询优化器将根据许多因素决定使用(或不使用)索引,包括表的大小,索引统计信息,结果集将触摸的磁盘页数等等。

理论上,它可以提高性能。主要问题是索引是否可以阻止磁盘IO(这几乎是所有数据库性能问题中的主要问题,因为事实证明,因为磁盘IO至少比内存访问慢一个数量级)。因此,如果查看索引可以告诉查询优化器您的查询只会触及磁盘页面子集上的记录,那么查询优化器就能够只读取这些磁盘页面。如果这是整个表的一小部分,它(可能)比表扫描更快。

问题是,这个“理论上”的答案留下了很多细节,这些细节会影响主要方面的性能,比如缓存(这些磁盘页面中有多少已经存在于内存中?)。它还取决于你“之间”的数值是否涵盖范围很广或范围很窄。因此,在127.0.0.1和127.0.0.10之间查找内容可能会触及少量磁盘页面(假设没有数据偏差),因此索引确实会有所帮助。然而,找到介于0.0.0.0和255.255.255.255之间的东西将包括所有记录,并且除了占用房间和周期之外,索引不会做深蹲。

所以简而言之,你必须尝试一下才能看到。使用表的两个版本设置一个小实验,一个是索引的,一个不是,并查看一些典型的“之间”查询是否使用索引来获得速度优势。理想情况下,在压力情况下尝试(例如,运行它很多次,理想情况下同时执行),这将告诉您更多关于真实世界的表现。

也许。 :)

答案 2 :(得分:1)

您可以使用EXPLAIN SELECT ...查询来检查用于此比较的索引(如果有)。