前言-------------------
http://community.csdn.net/Expert/topic/4520/4520172.xml?temp=.1769068
搜索性能问题
程序是关于软件搜索的
现在MS SQL库中有27万的数据,以后还会增加,服务器的配置是CPU奔4 3.0GHz 内存1G
搜索关键字是按软件名称(一般在20个字符以内)或者软件简介
软件简介我是用全文索引,软件名称我嫌用全文索引搜索不过准确,只用了索引现在的问题是按软件名称搜索速度超慢,按软件简介也没有我想象中的快,用Cache把所有数据放到内存当中我试过了也不快(关键是要匹配关键字太慢了),到底有什么办法能提高速度呢,我第一次接触这么多的数据,不知道如何做
=======================================================去年发的帖子了,到现在还没人回答出好的方法,现在我没办法了,
我把28万的数据用application["soft"]=dataset放到了内存里,差不多占用了200M的内存
放到内存之前是245M/3980M
放到内存之后是376M/3980M
搜索的时候内存使用是403M/3980M
然后内存使用一直保持在403M左右请问这样以后很多人搜索服务器会受的了吗,有好的解决方案吗?数据以后还会在增加一些。

解决方案 »

  1.   

    是专用服务器啊 CPU奔4 3.0GHz 内存1G,而且数据库是放在另一个服务器上现在内存使用是403M / 3980M
    还有很大的可用空间把?
      

  2.   

    是专用服务器啊 CPU奔4 3.0GHz 内存1G,而且数据库是放在另一个服务器上现在内存使用是403M / 3980M
    还有很大的可用空间把?
      

  3.   

    把必须的字段丢cache中把,反正你内存够大
      

  4.   

    如果你这台服务器绝对不做任何其它的事,用一个Remoting接口与其它进程通讯专门用来检索标题的,这样设计当然可以。如果这台服务器处理业务逻辑,那么你的系统将经常需要申请动态内存、需要申请其他大量资源,那么你的服务器就会在真正业务需要它的能力时(例如假日)宕掉。
      

  5.   

    我觉得28万,搜索起来效率上不会有什么问题.没有必要这样消耗服务的内存.
    你可以用sql的全文搜索.我做200万的搜索也没有太明显的效率问题.
      

  6.   

    cache中,如这样:
    先建立总数据的表引索,然后把你的所有数据一定的逻辑截开.
    查找数据时,先通过总数据的表引索检索到你的所在的表,然后再导向索要的数据表中搜索.
    这样做主要属避免大对象的释放与实例化,可以在一定程度上提高性能.
      

  7.   

    我觉得28万,搜索起来效率上不会有什么问题.没有必要这样消耗服务的内存.
    你可以用sql的全文搜索.我做200万的搜索也没有太明显的效率问题.
    ====================================================================我知道全文搜索可以,但是搜索不精确,老板说了不行,用like搜索又非常慢
    我实在想不出有什么好办法,做人真难啊
      

  8.   

    楼上的 我有点晕
    无论你数据库它怎么优化,数据一多查询就是慢,难道我测试出来的时间是假的?
    直接用like+索引查询名称要3秒左右,查询简介要10几秒放在内存里查询名称要0.5秒左右,查询简介要1秒多
    哪个牛人透露点技术给我,感激不尽
      

  9.   

    另外可以对搜索结果做cache,因为你的软件列表不会经常变动的而搜索是要经常做的,如果有人搜索了 flash肯定有其他人会再次搜索 "flash"如果把第一次的搜索结果保存到文件,第二次就不需要再次搜索了
      

  10.   

    不知道楼主怎么做的,在我的破机器上就算用Regex去匹配1百万条记录也不过是  0.5秒左右,这还是有匹配的情况,没有匹配会更快private void Test()
    {
    Regex re = new Regex("flash", RegexOptions.Compiled);
    CP();
    for(int i = 0; i < 1000000; i++)
    {
    re.Match("micro media flash 8.0");
    }
    CP();
    Pause();
    }
      

  11.   

    试了下28万,没有匹配的大概也就30ms,
    (搜索 "micro media first 8.0")所以你的查询平均能达到50ms/搜索是完全可能的
      

  12.   

    另外可以试试自己建立搜索引擎,这样会更加快像lucene这样的,可以按要求建立索引"flash",可以分别建立 f,l,a,s,h,fl,fla,flas,flash,la,las,lash,as,ash,sh这样的索引,这样你就能使用like 一样的搜索了这样做会更加快
      

  13.   

    我是初级生,楼上们说的我都不太明白,能否详细点TO:回复人: xuwenzhuo
    -----------------------
    如何分隔数据?我不懂啊TO:回复人: wutian789(天涯) 
    ------------------------
    我不是说了全文搜索不精确吗,老板说不行。至于如何能使全文搜索变精确我又不懂TO:回复人:gngnandgngn(仗义执言) 
    -------------------------
    我知道是搜索方式的问题啊,所以才问你们有没什么好的方法啊TO:回复人:tiaoci(我挑刺,我快乐) 
    --------------------------------
    280000 * 20(字节) * 2 = 11M
    怎么会这样算的呢,简介可不只20个字如果用CACHE那我还不如放内存啊,如果很多人同时搜索不同的关键字,那会有多少cache啊?private void Test()
    {
    Regex re = new Regex("flash", RegexOptions.Compiled);
    CP();
    for(int i = 0; i < 1000000; i++)
    {
    re.Match("micro media flash 8.0");
    }
    CP();
    Pause();
    }
    这个是如何用的啊?哪里有这种东西的资料啊,能否提供一点啊,感激不尽还有自己建立搜索引擎是如何建的呢
    "flash",可以分别建立 f,l,a,s,h,fl,fla,flas,flash,la,las,lash,as,ash,sh
    我不只FLASH,还有PHOTOSHOP,firwork,......很多啊,哪里建的完啊我就想要你的
    private void Test()
    {
    Regex re = new Regex("flash", RegexOptions.Compiled);
    CP();
    for(int i = 0; i < 1000000; i++)
    {
    re.Match("micro media flash 8.0");
    }
    CP();
    Pause();
    }
    给我点资料把,[email protected] 谢谢
      

  14.   

    cache 放文件中的啊,查询得到结构后存到数据文件中,不占用内存你要的代码中CP 是我检查使用时间的函数,Pause 是我的读取回车的函数这些你自己改改就可以了啊,至于那个键索引,其实你自己觉得会有很多,实际不会的因为字母只有 26 个,双字母只有26*26,三字母以上又不是全组合也不会很多,你想想应当会明白吧 :)