网站中有这样一个页面:该页面是一个汇总的页面,有6个模块,分别显示6个分类的前6条信息。现在我的做法是一次性把这6个分类的前6条信息都查出来,然后遍历输出到页面上,因数据量较大,所以这个查询很慢,这个查询每执行一次,查询时间都在2秒左右,求好的思路来实现这个功能。3q。。

解决方案 »

  1.   


    这点东西不应该会慢啊。。你sql语句是肿么写的?
      

  2.   

    优化sql语句,字段加索引。查出后存入Cache。
      

  3.   

    索引已添加。sql如下:
    ==========================================
    set ANSI_NULLS ON
    set QUOTED_IDENTIFIER ON
    goALTER proc [dbo].[Proc_GetHZXinXiList]
    (
    @num int,
    @id1 int,
    @id2 int,
    @id3 int,
    @id4 int,
    @id5 int,
    @id6 int,
    @dqid int,
    @tbname varchar(20)
    )
    as
    declare @sql varchar(900)
    declare @strdq varchar(100)
    if @dqid<10
    set @strdq=''
    else
    set @strdq='pdiqu_id = '+str(@dqid)+' and'
    if EXISTS(select * from diqu where id=@dqid and parentid=0)
    begin
    set @sql = 'select top '+str(@num)+' id,title,content,addtime,fenlei_id from '+@tbname+' where fenlei_id = '+str(@id1)+' and pdiqu_id = '+str(@dqid)+' order by addtime desc;'
    set @sql = @sql + 'select top '+str(@num)+' id,title,content,addtime,fenlei_id from '+@tbname+' where '+@strdq+' fenlei_id = '+str(@id2)+' order by addtime desc;'
    set @sql = @sql + 'select top '+str(@num)+' id,title,content,addtime,fenlei_id from '+@tbname+' where '+@strdq+' fenlei_id = '+str(@id3)+' order by addtime desc;'
    set @sql = @sql + 'select top '+str(@num)+' id,title,content,addtime,fenlei_id from '+@tbname+' where '+@strdq+' fenlei_id = '+str(@id4)+' order by addtime desc;'
    set @sql = @sql + 'select top '+str(@num)+' id,title,content,addtime,fenlei_id from '+@tbname+' where '+@strdq+' fenlei_id = '+str(@id5)+' order by addtime desc;'
    set @sql = @sql + 'select top '+str(@num)+' id,title,content,addtime,fenlei_id from '+@tbname+' where '+@strdq+' fenlei_id = '+str(@id6)
    set @sql = @sql + ' order by addtime desc'
    end
    else
    begin
    set @sql = 'select top '+str(@num)+' id,title,content,addtime,fenlei_id from '+@tbname+' where mdiqu_id = '+str(@dqid)+' and fenlei_id = '+str(@id1)+' order by addtime desc;'
    set @sql = @sql + 'select top '+str(@num)+' id,title,content,addtime,fenlei_id from '+@tbname+' where mdiqu_id = '+str(@dqid)+' and fenlei_id = '+str(@id2)+' order by addtime desc;'
    set @sql = @sql + 'select top '+str(@num)+' id,title,content,addtime,fenlei_id from '+@tbname+' where mdiqu_id = '+str(@dqid)+' and fenlei_id = '+str(@id3)+' order by addtime desc;'
    set @sql = @sql + 'select top '+str(@num)+' id,title,content,addtime,fenlei_id from '+@tbname+' where mdiqu_id = '+str(@dqid)+' and fenlei_id = '+str(@id4)+' order by addtime desc;'
    set @sql = @sql + 'select top '+str(@num)+' id,title,content,addtime,fenlei_id from '+@tbname+' where mdiqu_id = '+str(@dqid)+' and fenlei_id = '+str(@id5)+' order by addtime desc;'
    set @sql = @sql + 'select top '+str(@num)+' id,title,content,addtime,fenlei_id from '+@tbname+' where mdiqu_id = '+str(@dqid)+' and fenlei_id = '+str(@id6)
    set @sql = @sql + ' order by addtime desc'
    end
    exec(@sql)
      

  4.   

    优化sql的查询效率是必须的另外,你也可以在页面上采用ajax异步加载。就是说,不要在页面输出的时候把6个模块的所有内容一起加载,而是在页面load完成之后,用ajax一个一个的去取数据然后一个一个的加载。这样固然是增加了http的请求次数,但是对于用户响应,我认为还是可以接受的
      

  5.   

    to:goldenroses
    由于考虑的网站的优化 所以不考虑用ajax来实现这个功能的。还有什么好的方法吗。
      

  6.   

    其实方法很多:假如你的网站是相对静态型的网站,则可以采用cms的方式来处理,直接生成html。但是这样你改的就太多了还有一个办法,你需要评估一下,内容的更新频率有多快,在可以接受的范围内,把数据取出来之后,存入cache,设置一个相对的过期时间。这样你就不用每次都去重新取数据了。
      

  7.   

    尽可能提高查询性能方法还是有很多,优化sql、异步加载什么的
      

  8.   

    要想性能好,存储过程就不要写成通用的,不要拼接,直接写sql语句。
    亦或 拿张表存储最新的6条记录,增加一点插入成本,对几十上百条记录的表查询可想而知。
      

  9.   

    把这块内容生成XML,再缓存这个XML,数据有更新时再生成XML
      

  10.   

    最基本地所谓的“优化”,就是根本不去做什么查询优化。你的层次稍微站的高一点就会发现,跳出原来的“增删改查”的狭窄事业就会发现,为什么要不断地重复去查询数据库呢?而真正的架构设计基本一致。例如直接使用数据Cache缓存,例如每当底层信息改变时预先去生成一个报表(每一次去查询早已经生成的报表数据而不是临时汇总报表),大同小异。
      

  11.   

    建立一个新表,专门存放跟显示相关的内容,这样每次显示的内容都从你的新建的表中读取就行,这样速度就快多了。每次修改相应的表的时候就更新新表。如果效率还想再高,那就再结合使用Cache。