日期:2014-05-18  浏览次数:20804 次

100万条记录,多人、多次查询,怎么做查询比较快?
有一个网站,记录暂时100万条,做整站查询的额时候
暂时只查询新闻的标题。

ID,TITLE

如果单个人查询,可以用网上很多的SQL 分页代码查询,如果同时多个人查询,查询的关键词不同。
速度会大大降低,请问有什么方法能够解决这个问题?
暂时先不同多台服务器方案,费用太大

可以通过算法、多表、或者其他的变通方法都行,谢谢大家。


------解决方案--------------------
可考虑储存过程,第一次访问时候将编译好的,放在高速缓冲区中,以后访问在高速缓冲区
调用存储过程,减轻服务器的资源压力。

另外减轻客户端与服务器的流量。

------解决方案--------------------
最短回复 索引
------解决方案--------------------
给标题加索引列,然后做全文索引
------解决方案--------------------
优化SQL语句
------解决方案--------------------
1、看sql执行效率问题了。优化sql语句。
2、如果不是实时查询的,也可以把查询的结果放在一个临时表中,然后从临时表中访问大大提高的
执行的效率,在设置服务器访问最小的时候作业中定时执行了。
------解决方案--------------------
索引 有必要的话要用位图索引
------解决方案--------------------
建立索引
------解决方案--------------------
百万级数据根据日期排序做分页喽?建个索引视图好了,里面写上ROW_NUMBER()排序,秒级查询。
------解决方案--------------------
或者用CTE,用NOLOCK取排序列出来排序,也很快
------解决方案--------------------
SQL code

--建立测试环境
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)
GO

SELECT 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

------解决方案--------------------
首先你要说一下你的带宽
自己的服务器?
独享?还是共享?

多人多次,主要开始看你的并发能力

------解决方案--------------------
SQL code
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 次。
*/

------解决方案--------------------

------解决方案--------------------
能不能用数据库分区表来解决这个问题呀。
------解决方案--------------------
100万并不多,这点数据量不建议分区
仔细设计好是正道,从CPU、HDD、数据库结构、SQL指令
------解决方案--------------------
可以用程序来解决部分问题,例如:缓存
因为访问的大部分都是默认查询,很容易关键字重复,把数据放缓存里面就不消耗数据库资源了
------解决方案--------------------
索引和存储过程在加上缓存.
------解决方案--------------------