索引二进制列是否会提高SQL语句之间的位置的性能?

索引二进制列是否会提高SQL语句之间的位置的性能?,sql,Sql,我有一个表,它有一个表示IP地址数据的二进制列。其中一个查询在该二进制列上执行比较 如果我为该列编制索引,SQL语句中的INTERWARD比较的性能会提高吗?您可以使用EXPLAIN SELECT…查询来检查用于此比较的索引(如果有)。一般来说,这样的问题只有在特定的数据库和数据集上尝试才能真正得到答案。查询优化器将根据许多因素做出使用(或不使用)索引的决定,包括表的大小、索引统计信息、结果集将接触多少磁盘页面等 理论上,它可以提高性能。主要问题是索引是否可以阻止磁盘IO(事实证明,这是几乎所有

我有一个表,它有一个表示IP地址数据的二进制列。其中一个查询在该二进制列上执行比较


如果我为该列编制索引,SQL语句中的INTERWARD比较的性能会提高吗?

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

一般来说,这样的问题只有在特定的数据库和数据集上尝试才能真正得到答案。查询优化器将根据许多因素做出使用(或不使用)索引的决定,包括表的大小、索引统计信息、结果集将接触多少磁盘页面等

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

问题是,这个“理论”答案漏掉了大量在主要方面影响性能的细节,比如缓存(这些磁盘页面中有多少已经在内存中?)。这还取决于“介于”之间的值覆盖的范围是宽还是窄。因此,查找127.0.0.1和127.0.0.10之间的内容可能会涉及少量磁盘页面(假设没有数据倾斜),因此索引将非常有用。然而,查找介于0.0.0.0和255.255.255.255之间的内容无论如何都将包括所有记录,索引除了占用空间和循环外不会执行“蹲”操作

所以简而言之,你必须试试看。让自己对两个版本的表做一个小实验,一个是索引的,另一个不是,看看一些典型的“中间”查询是否使用索引来获得速度优势。理想情况下,在有压力的情况下尝试(比如,多次运行,理想情况下同时运行),这将告诉你更多关于真实世界的表现

也许吧。:)

在这个例子中

SELECT * FROM MyTable WHERE BinaryCol BETWEEN x and y
SELECT BinaryCol, AnotherCol, YetAnotherCol FROM MyTable WHERE BinaryCol BETWEEN x and y
  • SELECT*
    可能意味着索引被忽略,尤其是当x/y覆盖了表的很大一部分时
  • 如果x/y是非常有选择性的,那么它将导致聚集索引出现错误
  • 这适用于单独使用BinaryCol的索引或已覆盖的索引
这个例子是

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

不幸的是,“这取决于”

这适用于什么数据库引擎?——可能也适用于其他RDBMS系统。