首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

100分.解决马上结贴,该怎么处理

2012-02-06 
100分..解决马上结贴有一个数据库的用户信息表现在有5亿多条记录,现在请给出怎么样设计,使通过用户编号查

100分..解决马上结贴
有一个数据库的用户信息表现在有5亿多条记录,现在请给出怎么样设计,使通过用户编号查询用户信息的速度更快。。用怎么样的算法算出查询大概需要多少的系统开销。。

[解决办法]
如果自己编制查询函数,
1:如果用户编号是数字型,可以对用户编号进行2分法查询
2:如果用户是其他字符型,将可以
struct
{
用户编号,
记录ID
}
建一个关于这个结构的有序(根据用户编号排序)数组,
查询时:用二分法查该数组,找对应ID,然后就可以找到了
添加记录时:将ID设为数据库的最大ID+1,然后将{用户编号,记录ID}插入有序数组
删除记录时:只在数组中删除该项,数据库不动
每过一定时期可以清理库,清理库的记录时:比较麻烦,可以对数据库中的每条记录ID在数组中查询,如果没有,则删除
[解决办法]

问题还是比较模糊,不知道这个数据库要求是静态的还是动态的,如果是动态的还需要考虑要方便的增删数据项。

如果是静态的,要取决于用户编码的形式,如果用户编码是连续的,只需要将表项的索引顺序存放,查找的时候计算一下地址即可。如果用户编码非连续,可以考虑使用压缩算法将其压缩成连续的。

对于动态数据库,没有什么特别好的方法,就是多级哈希表,至于级数和HASH长度,则要根据具体情况而定,主要是看:

CPU计算能力(如果CPU很强,可以考虑使用非常复杂的HASH算法,散列效果会比较好),
内存大小 (内存足够大的话,可以将索引表多放一些在内存里),
内存访问速度(如果内存访问的速度很快,可以级数多一些),
磁盘IO响应速度(响应很快的话可以多次读取,响应慢的话最好一次将很多数据读出来),
磁盘数据读取速度

等等,另外需要考虑会不会有并发访问,可以有针对性的进行优化。

Oracle的数据库之所以有n多优化选项,也是可以为特定的应用准备的,没有放之四海而皆准的方法。

因此楼主还需要将需求再弄的清楚一些。

热点排行