有一个网站,记录暂时100万条,做整站查询的额时候
暂时只查询新闻的标题。ID,TITLE如果单个人查询,可以用网上很多的SQL 分页代码查询,如果同时多个人查询,查询的关键词不同。
速度会大大降低,请问有什么方法能够解决这个问题?
暂时先不同多台服务器方案,费用太大可以通过算法、多表、或者其他的变通方法都行,谢谢大家。

解决方案 »

  1.   

    1、看sql执行效率问题了。优化sql语句。
    2、如果不是实时查询的,也可以把查询的结果放在一个临时表中,然后从临时表中访问大大提高的
    执行的效率,在设置服务器访问最小的时候作业中定时执行了。
      

  2.   

    位图索引好像是ORACLE的,暂时不会,我只会MS SQL,呵呵,谢谢大家,请继续。
      

  3.   

    百万级数据根据日期排序做分页喽?建个索引视图好了,里面写上ROW_NUMBER()排序,秒级查询。
      

  4.   

    或者用CTE,用NOLOCK取排序列出来排序,也很快
      

  5.   


    --建立测试环境
    IF OBJECT_ID('TB') IS NOT NULL DROP TABLE TB
    GO
    CREATE TABLE TB(
    ID UNIQUEIDENTIFIER PRIMARY KEY
    ,TITLE VARCHAR(100)
    ,CONTENT VARCHAR(MAX)
    ,UPDATE_DATE DATETIME
    )
    GO
    INSERT INTO TB
    SELECT TOP 1000000 NEWID(),NEWID(),NEWID(),GETDATE()
    FROM MASTER..SPT_VALUES T1
    CROSS JOIN MASTER..SPT_VALUES T2
    GO
    CREATE INDEX INX_TB_UPDATE_DATE ON TB(UPDATE_DATE)
    GOSELECT COUNT(1) FROM TB
    GO
    --1000000
    --CTE分页查询,取第1W页开始的20行
    SET NOCOUNT ON
    SET STATISTICS IO ON
    SET STATISTICS TIME ON
    GO
    ;WITH MU AS (
    SELECT 
    ID
    ,ROW_NUMBER() OVER(ORDER BY UPDATE_DATE DESC) AS ROW_NUM
    FROM DBO.TB WITH(NOLOCK)
    )
    SELECT ID FROM MU  WHERE ROW_NUM BETWEEN 10001 AND 10020
    GO
    /*
    SQL Server 分析和编译时间: 
       CPU 时间 = 0 毫秒,占用时间 = 0 毫秒。
    表 'TB'。扫描计数 1,逻辑读取 45 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
    */
    SET STATISTICS IO OFF
    SET STATISTICS TIME OFF
    SET NOCOUNT OFF
    简单写了个小例子参考吧。在排序列上建个索引后,按列取ROW_NUMBER()会走索引扫描,100W数据量的索引页也就是几十页,这个IO应该是可以接受的吧。
      

  6.   

    DECLARE @BEGIN INT,@END INT
    SELECT @BEGIN=900080,@END=1000000
    --SELECT TOP (@END-@BEGIN) ID FROM (
    --SELECT TOP (@END) UPDATE_DATE,ID FROM TB ORDER BY UPDATE_DATE DESC
    --) T ORDER BY UPDATE_DATE ASC
    ;WITH MU AS (
    SELECT 
    ID
    ,ROW_NUMBER() OVER(ORDER BY UPDATE_DATE DESC) AS ROW_NUM
    FROM DBO.TB WITH(NOLOCK)
    )
    SELECT ID FROM MU  WHERE ROW_NUM BETWEEN @BEGIN AND @END
    GO
    /*
     SQL Server 执行时间:
       CPU 时间 = 0 毫秒,占用时间 = 0 毫秒。
    表 'TB'。扫描计数 1,逻辑读取 3737 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
    */看错了,这种排序也会自动优化,这是最多的IO,一次查询几千次IO。
    不过这是全部排序的查询,实际查询时,建议加上日期条件,IO会小很多。
      

  7.   

    服务器是独享。带宽也不是瓶颈,主要的瓶颈是系统的实时反映性能。我先研究一下上面的SQL代码,谢谢。
      

  8.   


    不大明白,我试验了一下,为什么这么查询,在我的机器上,反而要慢了大概10%,并没有提高速度,他与正常的分页SQL ,我感觉差不多。但是如果加上TITLE 的like 以后,特别是,同时查询多个关键词以后就更慢了。比如同时查询下面这3个关键词,有的同时查询的多,有的查询的少
    title like '%abc%'  and title like '%bed%'  and title like '%dog%' 这样的怎么样能提高效率呢。查询字段的索引,查询方法的存储过程,都已经做了。
    因为查询结果是实时显示。还有什么方法,能让速度提上来,谢谢。
      

  9.   

    刚才的写错了,不知道为什么不能重新编辑。
    ---------------------------------------------------------
    比如同时查询下面这3个关键词,有的同时查询的多,有的查询的少
    title like '%abc%' or title like '%bed%' or title like '%dog%'  这样的怎么样能提高效率呢。查询字段的索引,查询方法的存储过程,都已经做了。
    因为查询结果是实时显示。还有什么方法,能让速度提上来,谢谢。
      

  10.   

    100万并不多,这点数据量不建议分区
    仔细设计好是正道,从CPU、HDD、数据库结构、SQL指令
      

  11.   

    我说一下我们公司做搜索的实现方式,我们同事是通过搜索引擎来实现的,就是用Lucene先建好索引,然后搜索时直接去读索引
      

  12.   

    用校验值索引,避免全文索引不准情况.alter table tbname add hash_title AS checksum(title)
    create index title_index1 on tbname (hash_title)select id,title from tbname 
    where checksum(@title)=hash_title
    and title=@title另:位图索引多用于olap.
      

  13.   

    很给力的帖子,但是一般情况下,对于大数据我们基本都是采用搜索引擎做处理,Lucene是个不错的选择