简要说明是程序某模块 不停的产生ID号,然后马上将这些ID号存入数据库中。现在我想判断某个ID号是否在这些产生的号码中。方法一:
根据 select count(*) from tablenamer where *** = '*****' 看结果是否>0 若>0 则表示该数据在数据中存在。
方法二:
每新产生一个ID,存入某内存中,如vector中,然后在vector中进行判断
上述二方法 其中方法一需要多次在数据库中查询
而且数据量是很大的 100w级数据。 上述方法 那个效率比较高呢。我现在试了是没发现有什么区别,可能是我现在测试的数据量比较小的原因
那具体那种方法效率比较高呢
或者还有其他方法没?谢谢
根据 select count(*) from tablenamer where *** = '*****' 看结果是否>0 若>0 则表示该数据在数据中存在。
方法二:
每新产生一个ID,存入某内存中,如vector中,然后在vector中进行判断
上述二方法 其中方法一需要多次在数据库中查询
而且数据量是很大的 100w级数据。 上述方法 那个效率比较高呢。我现在试了是没发现有什么区别,可能是我现在测试的数据量比较小的原因
那具体那种方法效率比较高呢
或者还有其他方法没?谢谢
如果实际情况确实如此,楼主可用bitset这个数据结构。
这个ID的产生是有原理的 具体是16位数字,是由月日时分秒+6位数字组成 如1201121212900001
当然数据库中的数据可能会超过100w
typedef struct _tagID
{
unsigned int nMonth ;
unsigned int nDate ;
unsigned int nHour ;
unsigned int nMinute ;
unsigned int nSecond ;
unsigned int nRand ;
} ID ;bool bExist[12][31][24][60][60][1000000] ;
...
不过实际当中得malloc吧,不然栈上不一定有这么大空间。
你这还没vector的效率高 而且并不需要拆分
你是定义了一个如此大的数组,然后再判断,那你这样在数组中查找的时候更费事了。
比我上面说的那2中方法更慢
方法二每次都要把数据读到内存,内存一定要够大,然后还要在内存中进行查找,也很费时间。还不如在用数据库的约束来实现id字段的唯一。插入失败说明id有可能是重复的,那就重新生成id再插入。
而用
bExist[12][31][24][60][60][1000000]
的话是直接判断那个ID所对应的元素是否为true即可,效率上完全不一样。
bExist[12][31][24][60][60][1000000]
的话是直接判断那个ID所对应的元素是否为true即可,效率上完全不一样。那我如何知道那个ID是否在数组中存在,那不是还得遍历数组。
vector遍历的效率比数组快,支持算法
不用知道ID是否在数组中存在
比如:ID id ;
... // id的生成过程
if (bExist[id.nMonth - 1][id.nDate - 1][id.nHour - 1][id.nMinute - 1][id.nSecond - 1][id.nRand])
{
}
else
{
}
再者,vector的遍历效率未必比数组高,遍历过程是没有涉及算法的。
如果用set存的话,搜索过程还有算法可言。如果楼主还想省空间,得用hash了。
对于已经排好序的数据,百万级对于查询来说只是个小数目(100w -> 20次比较)
如果内存足够大,能够直接用内排序,可以用方法二。(对于100w数据,估计排序和查询加在一起几百毫秒就够了),如果需要外部排序,还是用数据库简单些,很可能效率会更好。对方法一的建议:
select [id] from tablenamer where id = '*****' order by id
按楼主所述,第一步可以先对月份分12个区域,如果被查询ID月份对应的区域里没有任何ID,即可判断该ID不存在,如果月份区域有ID,再判断该月份区域内对应的日期区域……同理递推。