简要说明是程序某模块 不停的产生ID号,然后马上将这些ID号存入数据库中。现在我想判断某个ID号是否在这些产生的号码中。方法一:
   根据 select count(*) from tablenamer where *** = '*****'  看结果是否>0 若>0 则表示该数据在数据中存在。
   方法二: 
   每新产生一个ID,存入某内存中,如vector中,然后在vector中进行判断
  上述二方法 其中方法一需要多次在数据库中查询
  而且数据量是很大的 100w级数据。  上述方法 那个效率比较高呢。我现在试了是没发现有什么区别,可能是我现在测试的数据量比较小的原因
  那具体那种方法效率比较高呢 
  或者还有其他方法没?谢谢
   

解决方案 »

  1.   

    我估计这个ID应该是在某个范围之内,比如大于等于0,小于等于100w,
    如果实际情况确实如此,楼主可用bitset这个数据结构。
      

  2.   


    这个ID的产生是有原理的 具体是16位数字,是由月日时分秒+6位数字组成 如1201121212900001
    当然数据库中的数据可能会超过100w 
      

  3.   

    我的想法是这样:
    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吧,不然栈上不一定有这么大空间。
      

  4.   


    你这还没vector的效率高 而且并不需要拆分
    你是定义了一个如此大的数组,然后再判断,那你这样在数组中查找的时候更费事了。
    比我上面说的那2中方法更慢
      

  5.   

    方法一每次都要去读数据库,数量级大的话那么访问数据库会很费时间。
    方法二每次都要把数据读到内存,内存一定要够大,然后还要在内存中进行查找,也很费时间。还不如在用数据库的约束来实现id字段的唯一。插入失败说明id有可能是重复的,那就重新生成id再插入。
      

  6.   

    你的方法二要遍历vector,
    而用
    bExist[12][31][24][60][60][1000000] 
    的话是直接判断那个ID所对应的元素是否为true即可,效率上完全不一样。
      

  7.   


    bExist[12][31][24][60][60][1000000]
    的话是直接判断那个ID所对应的元素是否为true即可,效率上完全不一样。那我如何知道那个ID是否在数组中存在,那不是还得遍历数组。
    vector遍历的效率比数组快,支持算法
      

  8.   


    不用知道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了。
      

  9.   

    重点应放在排序的算法上。
    对于已经排好序的数据,百万级对于查询来说只是个小数目(100w -> 20次比较)
    如果内存足够大,能够直接用内排序,可以用方法二。(对于100w数据,估计排序和查询加在一起几百毫秒就够了),如果需要外部排序,还是用数据库简单些,很可能效率会更好。对方法一的建议: 
    select [id] from tablenamer where id = '*****' order by id
      

  10.   

    其实算法的思想就是对所有的ID分区域,
    按楼主所述,第一步可以先对月份分12个区域,如果被查询ID月份对应的区域里没有任何ID,即可判断该ID不存在,如果月份区域有ID,再判断该月份区域内对应的日期区域……同理递推。
      

  11.   

    遍历过程是可以有算法的 如二分等等vector有count_if,for_each,.....等函数,也可以自己写仿函数,查询的效率比数组快目前我是用vector做的,由于目前数据暂时不是很大,和直接查数据库没发现有多大的区别