IP快速查找数据库
最近一段时间,在研究PHP的共享内存。于是,我想尝试一下共享内存和普通文件相比,能提高多少的性能。本来想简单的把纯真IP数据库导入到共享内存然后查询。
但是,后来发现这个数据库设计过于复杂,查询IP速度非常的慢,于是我对这个数据库的结构重新进行了设计。
头部:4 * 4 个字节。就记录一个总数
//总数|0|0|0
索引区: (区域ID的格式:前 24 个bit是区域在文件中的的offset,后8个bit是长度,这样区域的名称长度不能超过255个字节)
//start|end|区域ID1|区域ID2
//start|end|区域ID1|区域ID2
数据区:简单的把所有区域的名称写在这块区域(过滤掉重复的数据)
//string1|string2|string3|string4...
这样简单化了查找:首先是读取总数,然后确定二分查找区域。查找到数据后,根据区域ID读取区域信息。
最后,经过测试,
纯真IP的原版查找速度是 1504个/s
改进IP查询文件版本查找速度是 3977 个/s
共享内存版本的查找速度是 6325个/s
因为涉及的文件太多,我不直接在这里拷贝代码,大家去google code 上去下载。
http://code.google.com/p/quickip
[
这个项目的开发计划:
0.5 版:发布一个PHP扩展,更加快速的查找IP,目前的速度是每秒 44万次查询。(目前已经开发完成,但是要做兼容linux 和 相关的文档工作)
1.0 版:发布查询的时候,分离:国家 省 市 区 详细地区 五个部分。(目前省份已经完成,但是市,和 区 还没有处理)
后面的版本现在没有计划。
]
运行:
先 运行:qqwry_tool/build_csv.php ,从纯真IP导出数据
然后 运行 :test/bulid_index.php,创建数据和索引
如果要测试 shmop 请先安装shmop这个PHP扩展,然后运行: shmop/shmop.create.php
接下来运行测试文件: test/ip_find.test.php test/ip_find_qqwry.php
原版的PHP版本的纯真IP有bug,导致不能完整的导出区域2. 我这里没有做修改,
所以data 目录下面生成的测试结果的区域2,可能会不一致。
注意:
qqwry 这个文件夹 是纯真IP的代码。不是本人写的。要符合纯真IP 的licence。