给大家出个题目:
C#,SQLSERVER,WINDOWS2003环境.
我有一个黑名单表,里面500多万行数据.字段:userid,insert_time.我的程序在处理用户请求的时候一定要判断他是否在黑名单,如果在的话,我就不给他处理.约束:黑名单有可能随时被修改(增,删).
约束:即使最新添加的黑名单,我也要求程序把其屏蔽.要求:写出一个高效率的解决方案(文字描述即可).
题目不算非常严谨,但基本没有什么歧异.大家有兴趣不妨留意.另外,为了活跃群气氛,我会把这个题目放到CSDN ,大家自行关注答案.

解决方案 »

  1.   

    只要给黑名单表达userid建立索引就可以了!!
      

  2.   

    LS,建立索引会导致insert变慢.并且,我的程序处理量如果惊人怎么办?  SQLSERVER 真能依靠索引来确保我的查询没问题吗.索引是个不错的方法,简单实用.但他并不适合本例子.或者说没有做到更好.
      

  3.   

    500万条3个字段的数据,开个500M的分布式缓存空间就可完全够了。直接把名单变成key-value的hash表,不会承受多大压力 。
      

  4.   


    可以考虑下分表,SQL2005这个方面好像支持的不错。
    如果还是不行的话,考虑下升级硬件
      

  5.   

    索引可以建,但无法解决问题.建立索引,1个查询至少也得1秒以上.如果这样的情况再碰到并发访问呢,遇到update 怎么办? sy_binbin 提供的分表不错,可以把本身 500万的查询有可能降低为最小 50万的查询量.是其中一个比较通过SQL优化来解决问题的解决方法.我还想听听有没有关于从程序入手的解决方法.jinjazz 的利用程序内存在hashtable 的方法没有考虑到数据库的实时更新.
      

  6.   

    海量不是系统架构设计当中的最重要参考标准,压力负载才是。如果我的服务器就我一个人用1千万数据我也能不借助db之外的优化措施轻松应对,如果同时很多人用,即便是1万数据也要考虑db之外的策略。
      

  7.   

    500w的hash table没啥,用不了多少内存,检索速度快,时间复杂度基本是O(1)对于大并发的系统,善用缓存,每次不去访问数据库才是王道
      

  8.   

    分表,只有两个字段,垂直拆分是没可能了,那就水平拆分吧,这是数据库上的解决方案其实hash才是最快的,占用百十来兆内存;如果嫌存储效率比较低下的话,可以考虑布隆过滤器
      

  9.   

    感谢大家参与.实际上这是我个人近期遇到的一个问题.并且我是用最差但最省开发时间的方法(没时间)
    说下我个人设想的比较好的做法.首先,hashtable肯定是最好的做法了,比任何的从sql方面优化都来得直接.因为他操作的就是内存.
    这个例子唯一麻烦的就是:怎么把数据库更新的内容也更新到内存.这个前提当然是从 所有的更新的地方开始设计,任何程序对 黑名单表插入信息的话,也需要对hashtable所在程序进行更新. 2者任意一项失败 则操作回滚.所以:
    1.从数据库初始化出hashtable到程序A
    2.C,D,E,F,G等程序对黑名单的任意更新操作均需要通知程序A,并且保障数据统一性
    其实我开这个帖子是想看看别人或许有其他什么方法也能有很优秀的效果.如果谁有更好的方法 欢迎拍个详细点的砖过来.