问题陈述:我们将收到一个数字(11位数字)的请求,并且必须在数据库中有效查找并根据其适合的范围返回一行(最后更新的)。 另外,我已经使用了 mysql 并使用适当的索引进行了负载测试,但是需要更多时间。
请求:12345678912
表中可能的行:
低范围:12345678901 高范围:12345678913 低范围:12345678910 高范围:12345678912 低范围:12345678902 高范围:12345678920
问题: 哪个数据库可以用来存储数百万范围数据并进行高效查找。如果可能的话,有更好的 mysql 方法吗?
我已经使用了 mysql 并使用适当的索引进行了负载测试,但是需要更多时间。 期望查找应该快速高效~500 毫秒。
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 很难进一步推进 - 我可以稍后在其他地方添加更大的测试运行。