Java 在startIPNum和endIPNum范围内查找IP号码,并对Hibernate进行性能优化

Java 在startIPNum和endIPNum范围内查找IP号码,并对Hibernate进行性能优化,java,sql,mysql,performance,hibernate,Java,Sql,Mysql,Performance,Hibernate,我有一个ID为startIPNum和endIPNum的表。startIPNum和endIPNum已转换为长数字,而不是IP字符串 下面的查询可以工作,大约需要3000到3200毫秒 List<GeoIP> oneResult = new LinkedList(getHibernateTemplate().find( "from GeoIP where "+ipNum+" >= startIpNum and "+ipNum+" <= endIpNu

我有一个ID为startIPNum和endIPNum的表。startIPNum和endIPNum已转换为长数字,而不是IP字符串

下面的查询可以工作,大约需要3000到3200毫秒

 List<GeoIP> oneResult = new LinkedList(getHibernateTemplate().find(
            "from GeoIP where "+ipNum+" >= startIpNum and "+ipNum+" <= endIpNum"));
List oneResult=new LinkedList(getHibernateTemplate().find(

“from GeoIP,其中“+ipNum+”>=startIpNum和“+ipNum+”很难说,但可能需要在
startIpNum
endIpNum
上组合索引:

CREATE INDEX range_idx ON geoip (endIPNum, startIPNum);
您可能还必须更改代码,这取决于查询优化器的智能程度。我执行了类似的查找功能,其中组合索引不起作用,因此我只对范围结尾进行了索引,并执行了如下操作:

candidateRanges = query("from geoip where range_end >= $ip order by range_end")
if candidateRanges.size > 0 and candidateRanges[0].range_start <= ip:
    # We found a matching record, do something with it
else:
    # No match :(
candidateRanges=query(“从geoip,其中range\u end>=$ip按range\u end排序”)

如果candidateRanges.size>0和candidateRanges[0].range_start很难说,因为不知道您是如何索引表的,但是可能需要在
startIpNum
endIpNum
上组合索引:

CREATE INDEX range_idx ON geoip (endIPNum, startIPNum);
您可能还必须更改代码,这取决于查询优化器的智能程度。我执行了类似的查找功能,其中组合索引不起作用,因此我只对范围结尾进行了索引,并执行了如下操作:

candidateRanges = query("from geoip where range_end >= $ip order by range_end")
if candidateRanges.size > 0 and candidateRanges[0].range_start <= ip:
    # We found a matching record, do something with it
else:
    # No match :(
candidateRanges=query(“从geoip,其中range\u end>=$ip按range\u end排序”)

如果candidateRanges.size>0且candidateRanges[0].range\u start我建议优化可能在数据库中,而不是在hibernate查询中。要么向表中添加更好的索引,要么编写存储过程。但我怀疑单靠hibernate将获得更好的性能。

我建议优化可能在数据库中,而不是在hibernate查询中rnate查询。要么向表中添加更好的索引,要么编写存储过程。但我怀疑单靠hibernate就可以获得更好的性能。

我最后做的是从maxmind获取数据库文件,性能提高了1000%。正如gustafc所说,它是为此目的而优化的结构。这是我的春天整合:

<bean id="lookupService" class="com.maxmind.geoip.LookupService">
    <constructor-arg index="0" type="java.io.File" value="classpath:GeoLiteCity.dat"/>
    <constructor-arg index="1" type="java.lang.String" value="1"/>
</bean>

此代码的检索时间在2到9毫秒之间!!!

我最后做的是从maxmind获取数据库文件,性能提高了1000%。正如gustafc所说,它的结构正是为此而优化的。以下是我的spring集成:

<bean id="lookupService" class="com.maxmind.geoip.LookupService">
    <constructor-arg index="0" type="java.io.File" value="classpath:GeoLiteCity.dat"/>
    <constructor-arg index="1" type="java.lang.String" value="1"/>
</bean>

此代码的检索时间介于2到9毫秒之间!!!

我遇到了类似的性能问题,然后使用了以下技术:


产生了巨大的差异-从60倍到100倍的改善。YMMV。

我遇到了类似的性能问题,然后使用了以下技术:


产生了巨大的差异-从60倍到100倍的改进。YMMV。

对于最长前缀匹配IP地址查找,有高度优化的数据结构,但它们不适合SQL数据库模型。(参见示例)有用于最长前缀匹配IP地址查找的高度优化的数据结构,但它们不适合SQL数据库模型。(参见示例)这是一篇非常好的文章!现在就试用。在360万条记录上创建空间索引需要一段时间!这是一篇非常好的文章!现在就试用。在360万条记录上创建空间索引需要一段时间!