有一个网站,记录暂时100万条,做整站查询的额时候
暂时只查询新闻的标题。
ID,TITLE
如果单个人查询,可以用网上很多的SQL 分页代码查询,如果同时多个人查询,查询的关键词不同。
速度会大大降低,请问有什么方法能够解决这个问题?
暂时先不同多台服务器方案,费用太大
可以通过算法、多表、或者其他的变通方法都行,谢谢大家。
------解决方案--------------------
可考虑储存过程,第一次访问时候将编译好的,放在高速缓冲区中,以后访问在高速缓冲区
调用存储过程,减轻服务器的资源压力。
另外减轻客户端与服务器的流量。
------解决方案--------------------
最短回复 索引
------解决方案--------------------
给标题加索引列,然后做全文索引
------解决方案--------------------
优化SQL语句
------解决方案--------------------
1、看sql执行效率问题了。优化sql语句。
2、如果不是实时查询的,也可以把查询的结果放在一个临时表中,然后从临时表中访问大大提高的
执行的效率,在设置服务器访问最小的时候作业中定时执行了。
------解决方案--------------------
索引 有必要的话要用位图索引
------解决方案--------------------
建立索引
------解决方案--------------------
百万级数据根据日期排序做分页喽?建个索引视图好了,里面写上ROW_NUMBER()排序,秒级查询。
------解决方案--------------------
或者用CTE,用NOLOCK取排序列出来排序,也很快
------解决方案--------------------
- SQL code
--建立测试环境IF OBJECT_ID('TB') IS NOT NULL DROP TABLE TBGOCREATE TABLE TB(ID UNIQUEIDENTIFIER PRIMARY KEY,TITLE VARCHAR(100),CONTENT VARCHAR(MAX),UPDATE_DATE DATETIME)GOINSERT INTO TBSELECT TOP 1000000 NEWID(),NEWID(),NEWID(),GETDATE()FROM MASTER..SPT_VALUES T1CROSS JOIN MASTER..SPT_VALUES T2GOCREATE INDEX INX_TB_UPDATE_DATE ON TB(UPDATE_DATE)GOSELECT COUNT(1) FROM TBGO--1000000--CTE分页查询,取第1W页开始的20行SET NOCOUNT ONSET STATISTICS IO ONSET STATISTICS TIME ONGO;WITH MU AS (SELECT ID,ROW_NUMBER() OVER(ORDER BY UPDATE_DATE DESC) AS ROW_NUMFROM DBO.TB WITH(NOLOCK))SELECT ID FROM MU WHERE ROW_NUM BETWEEN 10001 AND 10020GO/*SQL Server 分析和编译时间: CPU 时间 = 0 毫秒,占用时间 = 0 毫秒。表 'TB'。扫描计数 1,逻辑读取 45 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。*/SET STATISTICS IO OFFSET STATISTICS TIME OFFSET NOCOUNT OFF
------解决方案--------------------
首先你要说一下你的带宽
自己的服务器?
独享?还是共享?
多人多次,主要开始看你的并发能力
------解决方案--------------------
- SQL code
DECLARE @BEGIN INT,@END INTSELECT @BEGIN=900080,@END=1000000--SELECT TOP (@[email protected]) 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_NUMFROM DBO.TB WITH(NOLOCK))SELECT ID FROM MU WHERE ROW_NUM BETWEEN @BEGIN AND @ENDGO/* SQL Server 执行时间: CPU 时间 = 0 毫秒,占用时间 = 0 毫秒。表 'TB'。扫描计数 1,逻辑读取 3737 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。*/
------解决方案--------------------
------解决方案--------------------
能不能用数据库分区表来解决这个问题呀。
------解决方案--------------------
100万并不多,这点数据量不建议分区
仔细设计好是正道,从CPU、HDD、数据库结构、SQL指令
------解决方案--------------------
可以用程序来解决部分问题,例如:缓存
因为访问的大部分都是默认查询,很容易关键字重复,把数据放缓存里面就不消耗数据库资源了
------解决方案--------------------
索引和存储过程在加上缓存.
------解决方案--------------------