有一个网站,记录暂时100万条,做整站查询的额时候
暂时只查询新闻的标题。ID,TITLE如果单个人查询,可以用网上很多的SQL 分页代码查询,如果同时多个人查询,查询的关键词不同。
速度会大大降低,请问有什么方法能够解决这个问题?
暂时先不同多台服务器方案,费用太大可以通过算法、多表、或者其他的变通方法都行,谢谢大家。
暂时只查询新闻的标题。ID,TITLE如果单个人查询,可以用网上很多的SQL 分页代码查询,如果同时多个人查询,查询的关键词不同。
速度会大大降低,请问有什么方法能够解决这个问题?
暂时先不同多台服务器方案,费用太大可以通过算法、多表、或者其他的变通方法都行,谢谢大家。
2、如果不是实时查询的,也可以把查询的结果放在一个临时表中,然后从临时表中访问大大提高的
执行的效率,在设置服务器访问最小的时候作业中定时执行了。
--建立测试环境
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应该是可以接受的吧。
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会小很多。
不大明白,我试验了一下,为什么这么查询,在我的机器上,反而要慢了大概10%,并没有提高速度,他与正常的分页SQL ,我感觉差不多。但是如果加上TITLE 的like 以后,特别是,同时查询多个关键词以后就更慢了。比如同时查询下面这3个关键词,有的同时查询的多,有的查询的少
title like '%abc%' and title like '%bed%' and title like '%dog%' 这样的怎么样能提高效率呢。查询字段的索引,查询方法的存储过程,都已经做了。
因为查询结果是实时显示。还有什么方法,能让速度提上来,谢谢。
---------------------------------------------------------
比如同时查询下面这3个关键词,有的同时查询的多,有的查询的少
title like '%abc%' or title like '%bed%' or title like '%dog%' 这样的怎么样能提高效率呢。查询字段的索引,查询方法的存储过程,都已经做了。
因为查询结果是实时显示。还有什么方法,能让速度提上来,谢谢。
仔细设计好是正道,从CPU、HDD、数据库结构、SQL指令
create index title_index1 on tbname (hash_title)select id,title from tbname
where checksum(@title)=hash_title
and title=@title另:位图索引多用于olap.