首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何设计一个数据库来对2个字段(最小和最大)进行快速范围查询

如何设计一个数据库来对2个字段(最小和最大)进行快速范围查询
EN

Stack Overflow用户
提问于 2015-03-04 16:39:59
回答 2查看 313关注 0票数 0

我们有一个所有ip地址的数据库。它的名称是这样的

代码语言:javascript
复制
min_ip
max_ip
location

我需要尽可能快地检索行,比如

代码语言:javascript
复制
where min_ip > xxx and max_ip < xxx

问题是,在大多数数据库设计中只能使用一个索引(min_ip上的索引),因此查询总是有点慢。即使数据库可以使用2个索引,它仍然很慢,因为它们在内部执行2个查询(where min_ip > xxx)和(where max_ip < xxx)以及合并结果。

他们有什么技巧可以让这个查询运行得更快吗?我们现在使用mongodb和sphinx作为数据库引擎

EN

回答 2

Stack Overflow用户

发布于 2015-03-04 18:41:01

可以使用RTree索引设置geoip数据库的索引,例如,请参阅http://blog.jcole.us/2007/11/24/on-efficiently-geo-referencing-ips-with-maxmind-geoip-and-mysql-gis/

可能在mongodb中可以做到这一点,看起来可能有RTree索引。

(我不认为狮身人面像是一个很好的选择。不确定它的索引结构是否适合这个。它可能能够非常快地运行查询,因为它总是在内存中保留属性,但它没有索引,所以正确的索引应该仍然可以击败它)

票数 0
EN

Stack Overflow用户

发布于 2015-03-08 00:07:17

首先,并不是所有的数据库都只允许使用一个索引。MySQL和MariaDB具有索引合并访问方法,该方法结合使用多个索引。

您还可以更改存储数据的方式,从而对其启用范围查询。可以选择将location设置为唯一索引,并将location、min-ip、location和max_ip存储为单独的记录,而不是存储min_ip、max_ip。然后,您可以对min_ip、max_ip使用范围查询。

第三个选项是使用空间索引和CONTAINS操作符。PostgreSQL,MySQL实现它。使用Tarantool,RTree索引存储在内存中,因此如果您的数据占用较小(几so到几百so),您可以期待即时响应。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28849891

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档