当前位置: 首页 > 面试题库 >

快速表索引以进行范围查找

公孙宏远
2023-03-14
问题内容

我有一个大约有450万行的Postgres表。列基本上只是

low BIGINT,
high BIGINT,
data1,
data2, 
...

当查询该表,你有一个长整型,并希望找到对应的范围内的数据low,并high包括该值。索引此表以进行快速查找的最佳方法是什么?


问题答案:

一个 多列索引 具有反向排序顺序:

CREATE INDEX tbl_low_high_idx on tbl(low, high DESC);

这样,可以将索引向前扫描到low足够高的位置,然后对所有行进行扫描直到high太低为止-
一次扫描。这就是为什么要对索引执行排序顺序的主要原因:将不同的排序顺序组合在具有不同顺序的多列索引中。基本上,b树索引可以以几乎相同的速度在两个方向上遍历,因此单列索引几乎不需要ASC/
DESC

您可能也对 PostgreSQL 9.2* 的新
范围类型

感兴趣。可以使用
GiST索引
进行索引,如下所示:
*
****

CREATE INDEX tbl_idx ON tbl USING gist (low_high);

应该使这种形式的查询执行得非常快:

SELECT * FROM tbl WHERE my_value <@ low_high;

<@是“元素包含在”运算符中。



 类似资料:
  • 使用DynamoDB,没有简单的方法可以对列执行索引范围查询。主键、本地二级索引和全局二级索引都需要分区键来进行范围查询。 例如,假设我有一个带有数字分数属性的高分表。使用索引范围查询无法获得前10名或前25至50名 那么,执行这项极其常见的任务的惯用方式或首选方式是什么呢? > 接受表格扫描。 使用静态分区键并利用分区查询。 使用固定数量的静态分区键并使用多个分区查询。

  • 我有一个大约为100GB的cosmos数据库。我成功地创建了一个漂亮的分区键,我在70M记录上有大约4600个分区,但是我仍然需要查询两个存储为字符串的日期时间字段,而不是纪元格式。 示例json: 我注意到当我做中选择*以及当我做

  • 问题是:我有一个包含时间和值(时间=长毫秒和双值)的数据列表。我现在需要计算不同时间范围内的几个平均值 我每秒最多可以得到50个值,但有时只有几个值,需要保持最后10秒,所以500个值。 我想要的是:计算时间的平均值 我可以保证没有时间是双倍的,所以它可以用作一把钥匙。 目前,我使用一个数组来存储值,并且有一个位置标记,一旦达到500,它就会重置为0,所以旧的条目会被重新调整样式。我可以很容易地改

  • 问题内容: …或者如何在for循环条件中使用索引 大家好,因为我们在Swift 3中没有使用c风格的循环,所以我似乎找不到一种表达一些复杂的循环的方法,所以也许您可以帮我一下。 如果我要写这个 快速3我该怎么做? 我的关闭时间是: 但这当然会一次迭代5个块,如果我是:5、25、125等。 有任何想法吗? 谢谢 问题答案: 使用辅助函数(最初在将使用除法的C样式for循环转换为Swift3时定义 您

  • 问题内容: 我在读取CSV文件时遇到此错误(无标题,3列,第二和第三字符串): 这是下面代码的一部分。坚持起来简直是愚蠢的简单事情,但是对于如何工作我只是空白。我是编码的新手,但是之前已经处理过csv模块,并且从来没有遇到过这方面的问题,只是在记事本中制作了一些测试csv文件,以查看是否可以从相同的代码中读取它,并且可以。我不知道。 问题答案: 尝试检查空白行。另外,请避免将其用作变量名。是打开的

  • 问题内容: 我正在遍历Go语言之旅中的练习,但遇到了我无法弄清的障碍。我在做这个错误: 这是我的代码: 对于我一生,我找不到问题! 问题答案: 切片 对于字符串,数组,指向数组的指针或切片a,主表达式 a [低:高] 构造一个子字符串或切片。索引表达式low和high选择哪些元素出现在结果中。结果的索引从0开始,长度等于高-低。 对于数组或字符串,索引low和high必须满足0 <= low <=