更好的方法或数据库来存储5000万范围数据和快速搜索操作

问题描述 投票:0回答:1

问题陈述:我们将收到一个数字(11位数字)的请求,并且必须在数据库中有效查找并根据其适合的范围返回一行(最后更新的)。 另外,我已经使用了 mysql 并使用适当的索引进行了负载测试,但是需要更多时间。

请求:12345678912

表中可能的行:

低范围:12345678901 高范围:12345678913 低范围:12345678910 高范围:12345678912 低范围:12345678902 高范围:12345678920

问题: 哪个数据库可以用来存储数百万范围数据并进行高效查找。如果可能的话,有更好的 mysql 方法吗?

我已经使用了 mysql 并使用适当的索引进行了负载测试,但是需要更多时间。 期望查找应该快速高效~500 毫秒。

mysql database postgresql query-optimization date-range
1个回答
0
投票

PostgreSQL 内置了 范围类型,它提供了

@>
包含运算符,由 GiST 和 SP-GiST 索引支持:db<>fiddle 上的较小演示

select setseed(0.1);
create table test (r int8range);
insert into test 
select int8range(least(a,b),greatest(a,b),'[]') from (
select (random()*2e10)::int8 a,(random()*2e10)::int8 b
from generate_series(1,(random()*15e6)::int))_;

insert into test values (int8range(12345678901,12345678913,'[]'));
insert into test 
select int8range(least(a,b),greatest(a,b),'[]') from (
select (random()*2e10)::int8 a,(random()*2e10)::int8 b
from generate_series(1,(random()*15e6)::int))_;

insert into test values (int8range(12345678910,12345678912,'[]'));
insert into test 
select int8range(least(a,b),greatest(a,b),'[]') from (
select (random()*2e10)::int8 a,(random()*2e10)::int8 b
from generate_series(1,(random()*15e6)::int))_;

insert into test values (int8range(12345678902 ,12345678920,'[]'));
insert into test 
select int8range(least(a,b),greatest(a,b),'[]') from (
select (random()*2e10)::int8 a,(random()*2e10)::int8 b
from generate_series(1,(select 5e7-count(*) from test)))_;

create index on test using gist(r);

vacuum analyze test;


explain analyze verbose
select * from test where r@>12345678912;
查询计划
仅在 public.test 上使用 test_r_idx 进行索引扫描(成本=0.28..5737.50行=99498宽度=22)(实际时间=0.133..53.071行=99861循环=1)
  输出:r
  索引条件:(test.r @> '12345678912'::bigint)
  堆获取:0
规划时间:1.244毫秒
执行时间:56.476 ms

50 万行需要 56 毫秒,而且您的点击次数要多得多。由于平台的磁盘空间限制,db<>fiddle 很难进一步推进 - 我可以稍后在其他地方添加更大的测试运行。

© www.soinside.com 2019 - 2024. All rights reserved.