我们有一个所有ip地址的数据库。它的名称是这样的
min_ip
max_ip
location我需要尽可能快地检索行,比如
where min_ip > xxx and max_ip < xxx问题是,在大多数数据库设计中只能使用一个索引(min_ip上的索引),因此查询总是有点慢。即使数据库可以使用2个索引,它仍然很慢,因为它们在内部执行2个查询(where min_ip > xxx)和(where max_ip < xxx)以及合并结果。
他们有什么技巧可以让这个查询运行得更快吗?我们现在使用mongodb和sphinx作为数据库引擎
发布于 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索引。
(我不认为狮身人面像是一个很好的选择。不确定它的索引结构是否适合这个。它可能能够非常快地运行查询,因为它总是在内存中保留属性,但它没有索引,所以正确的索引应该仍然可以击败它)
发布于 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),您可以期待即时响应。
https://stackoverflow.com/questions/28849891
复制相似问题