提搞网站访问速度可做哪些优化

提搞网站访问速度可做哪些优化

 

一、  服务器优化

l  Windows系列:

  • 64位Win2008r2 + Hpyer-V + 负载均衡 + IIS7.5
  • 64位Win2003 + 虚拟机 + 负载均衡 + IIS6
  • 禁止服务器访问外网。关掉不必要的端口。
  • 去掉每个磁盘的所有权限,只保留administrators组和system完全控制权限。
  • IIS7.5标识使用ApplicationPoolIdentity,给目录权限用户是:IIS AppPool\站点名
  • IIS6需要为每个站点建独立的用户,为IIS用户单独设置权限。
  • IIS禁止日志记录。
  •  

二、  数据库优化

l  64位MSSQL2008:

  • 少用触发器/游标/外键。多用存贮过程和视图。适量使用索引查询速度会提高很多,每个表的索引尽量不要超过3个。
  • 定时查看死锁的进程和等待进程,并清除,还要及时修正死锁的来源。
  • 复杂的统计报表需要用计划去跑。
  • 查询记录数要使用count(0) 不要使用count(*)。
  • select的时候表字段不要使用*。*查询所有字段是很慢的。
  • 如果字段是索引列可使用UNION ALL 替代 OR,走索引线路查询。
  • 大记录集要使用分页查询。
  • 尽量不要使用TEXT/NTEXT类型,要使用VARCHAR(MAX)/NVARCHAR(MAX)。
  • 尽量不要使用临时表,要使用Table表类型或内嵌视图。
  •  

三、  后端优化

l  多使用DbDataReader,尽量不要使用DataTable/DataSet读取数据。

l  for (int i = 0; i < dt.Rows.Count; i++) 应该这么写:

for (int i = 0, len = dt.Rows.Count; i < len; i++)或

foreach (DataRow info in dt.Rows)推荐这种写法

l  少用try catch,用到try catch时要和 finally一起使用。

l  多使用using如:

using (DbDataReader dr = Data.GetDbDataReader(strSql)) { while (dr.Read()) { }; }

l  大字符串操作请使用StringBuilder 少使用string,字符串比较用Compare,字符串相加用Concat,大字符串相加用StringBuilder Append。

l  变量要在先定义在使用,不要在循环内定义变量。如:

错误的写法是:for (int i = 1; i < 10; i++) { string s = i.ToString(); }

正确写法:string s = string.Empty; for (int i = 1; i < 10; i++) { s = i.ToString(); }

这里还有一个地方要注意的:在字符串相加的时候,如果有int类型的要先转成string类型在相加,减少不必要的装箱拆箱操作。

l  如果你使用的是HTML控件,需要禁用<%@ Page EnableViewState="false" AutoEventWireup="false" EnableSessionState="false",web.config <pages enableViewState="false" enableSessionState="false" />

l  使用foreach替代for

l  操作数据库要使用存贮过程/视图。

l  多使用CACHE对数据缓存。这才是最关键的。NET提供:HttpContext.Current.Cache/HttpRuntime.Cache,共享缓存有velocity/ memcached

l  可使用<%@ OutputCache Duration="60" 缓存页面,可使用Response.BufferOutput = true;/ <%@ Page Buffer="true" 输出缓冲。

l  可将站点生成静态面页,好处多多。

l  可使用URL重写成伪静态,提供rss/baidu-sitemap/google-sitemap服务,有利于搜索引擎收录。

l  Ajax调用页面要使用.ashx一般处理程序,速度要比.aspx文件要快。Ajax请求要使用POST不要使用GET。

l  发布站点时DLL要Release版本,不要用Debug版本。

l  IIS需要使用集成模式,不要使用经典模式。

l  Web.config 加 <customErrors mode="On" /> 关闭错误提示。

l  Web.config 加 <compilation debug="false" /> 关闭调试模式。

l  使用Server.Transfer替换Response.Redirect

l  多使用泛型集合操作,少用ArrayList。

四、  前端优化

l  最好不使用NET控件,用HTML控件,页面使用CSS+DIV布局。

l  使用JSON + AJAX进行数据交互。

l  要学会使用jQuery提高开发速度。

l  尽量少用<img标记,改用background样式控制背景图片。这样做的好处是方便扩展多皮肤。

l  将CSS background背景图片多张合并成一张图片,保证合并后的图片大小不要超过50K。可将JS文件合并在一个JS文件中,然后使用closure_packer_yui_compiler进行压缩,这样做的好处是可减少客户端连接数。

l  JS代码段不要放在HTML页面,应该放在独立的JS文件里面,好处是JS文件可以CDN/缓存。

l  可将CSS文件放到<head></head>之间,JS文件或代码放到</body>之前,让页面先显示在执行JS。

l  可将网站的图片/CSS/JS/资料/资源放到独立的站点,做下CDN加速,二级域名会有COOKIES,最好使用一级域名。

l  A标记和IMG标记需要加上title/alt,<head>标签内需要加title/keywords/description/rss/sitemap优化,有利于搜索引擎收录。

l  页面可启用gzip压缩。

l  安装FF的插件“YSlow/Page Speed”。

五、  其它优化

 

2010-07-01

email:cexo255@163.com

MSN:cexo255@hotmail.com

posted @ 2010-08-07 16:37 熊哥 阅读(6295) 评论(47) 编辑 收藏

 回复 引用 查看   
#2楼2010-07-22 00:11 | zyip      
如果字段是索引列可使用UNION ALL 替代 OR,走索引线路查询。

能否举个例子或者详细说明一下

 回复 引用 查看   
#3楼2010-07-22 00:48 | Soli      
学习了。赞一个!

好像后端优化的前几条都可以通过编译器进行优化自动实现

 回复 引用 查看   
#4楼2010-07-22 08:35 | 版主      
string 类型的变量声明在里面和外面应该是没有什么区别的吧
它本身就是不可变的

 回复 引用 查看   
#5楼2010-07-22 09:16 | 叶子绿了      
发布站点时DLL要Release版本,不要用Debug版本。
为什么我建web应用程序,没有release 版本和debug版本,只有bin下面有 dll

 回复 引用 查看   
#6楼2010-07-22 09:17 | dail      
@zyip
原因是or在查询的时候,无法使用索引。将or拆开对单个字段利用索引,然后采用union 将结果集合并起来。

 回复 引用 查看   
#7楼2010-07-22 09:52 | 黑曜石      
这个不错,前后左右,全了
 回复 引用 查看   
#8楼2010-07-22 10:07 | 軒轅劍      
说的是比较全面了
 回复 引用 查看   
#9楼2010-07-22 10:13 | 黑色      
这里还有一个地方要注意的:在字符串相加的时候,如果有int类型的要先转成string类型在相加,减少不必要的装箱拆箱操作。
-----------------------------------------------------
如果int跟string类型能直接相加的话,我说的是如果啊,跟你先转后加,还不是一样存在箱拆

 回复 引用 查看   
#10楼[楼主]2010-07-22 10:37 | 熊哥      
@版主
引用版主:
string 类型的变量声明在里面和外面应该是没有什么区别的吧
它本身就是不可变的


嗯 string 类型的变量区别不大,要是其它占内存比较大的就不能这样定义了。

 回复 引用 查看   
#11楼[楼主]2010-07-22 10:42 | 熊哥      
引用叶子绿了:
发布站点时DLL要Release版本,不要用Debug版本。
为什么我建web应用程序,没有release 版本和debug版本,只有bin下面有 dll


web应用程序只有debug 没有release,你可以安装编译插件可将WEB站点发布一个DLL文件 没有.cs文件。

vs2008编译插件.rar
http://files.cnblogs.com/livexy/vs2008%e7%bc%96%e8%af%91%e6%8f%92%e4%bb%b6.rar
vs2005编译插件.rar
http://files.cnblogs.com/livexy/vs2005%e7%bc%96%e8%af%91%e6%8f%92%e4%bb%b6.rar

 回复 引用 查看   
#12楼[楼主]2010-07-22 10:44 | 熊哥      
引用zyip:
如果字段是索引列可使用UNION ALL 替代 OR,走索引线路查询。

能否举个例子或者详细说明一下



select a,b,c,d from table where a=20 or a=40
可这么写:
select a,b,c,d from table where a=20 union all
select a,b,c,d from table where a=40

 回复 引用 查看   
#13楼2010-07-22 11:01 | alexyang911      
Ajax请求要使用POST不要使用GET。

为什么要用post,get 有缓存不是更好?

 回复 引用 查看   
#14楼2010-07-22 11:39 | 敏而好学      
恩,挺好的
 回复 引用 查看   
#15楼2010-07-22 13:48 | Hopen      
引用alexyang911:
Ajax请求要使用POST不要使用GET。

为什么要用post,get 有缓存不是更好?

是因为安全原因吧

 回复 引用 查看   
#16楼2010-07-22 14:41 | !null      
很不错,
 回复 引用 查看   
#17楼2010-07-22 16:10 | ITLOVER      
很棒,我的团队也是这样干的。
 回复 引用 查看   
#18楼2010-07-22 22:28 | Ray Wu      
@熊哥
你说的or连接已经过时了吧,现在最近的sql server已经能够自动优化了

 回复 引用 查看   
#19楼2010-07-23 00:16 | 夜闻香      
赞一下
不过硬件和软件设备的要求有点苛刻啊

 回复 引用 查看   
#20楼2010-07-23 17:19 | 阿瑞|www.16hi.com      
还有很多吧
 回复 引用 查看   
#21楼2010-08-07 16:58 | killkill      
引用熊哥:
引用zyip:
如果字段是索引列可使用UNION ALL 替代 OR,走索引线路查询。

能否举个例子或者详细说明一下



select a,b,c,d from table where a=20 or a=40
可这么写:
select a,b,c,d from table where a=20 union all
select a,b,c,d from table where a=40


最差的情况第一条SQL最多一次表扫描,第二条SQL会有两次表扫描。
关于or和union的观点已经过时。

使用count(0) 不要使用count(*) 是一样的

每个表的索引尽量不要超过3个,这个不是硬性规定,也不是硬性指标。


IIS禁止日志记录,出问题就没法查了。


少用try catch,用到try catch时要和 finally一起使用,这个园子里已经讨论过了,没有异常,性能影响几乎为0,有异常,这个是最好的处理方法。

 回复 引用 查看   
#22楼2010-08-07 18:42 | 金色海洋(jyk)      
有一些是过时的,并不准确。
 回复 引用 查看   
#24楼[楼主]2010-08-07 18:49 | 熊哥      
引用yongfa365:如何提高网站浏览速度 思维导图


哈哈 思维导图是个好软件

 回复 引用 查看   
#25楼2010-08-07 18:54 | yongfa365      
@熊哥
要不,您也来个思维导图版?呵呵

 回复 引用 查看   
#26楼2010-08-07 19:04 | mmyijia.com~      
很多方法自己也有想到过
 回复 引用 查看   
#27楼2010-08-07 19:20 | 九百游      
倒,你这是优化呀,你这是自认为用得爽。。。。。。
 回复 引用 查看   
#28楼2010-08-07 19:23 | 晴天猪      
Mark
 回复 引用 查看   
#29楼2010-08-07 21:13 | lykyl的自留地      
我只看了服务器优化这部分。可以很肯定的说,如果按你说的那么配置不是正确的。

# 去掉每个磁盘的所有权限,只保留administrators组和system完全控制权限。
# IIS禁止日志记录

这两条完全是误导,而且按照第一条配置的话,ASP.net运行会出错

 回复 引用 查看   
#30楼2010-08-07 21:34 | killkill      
引用lykyl的自留地:
我只看了服务器优化这部分。可以很肯定的说,如果按你说的那么配置不是正确的。

# 去掉每个磁盘的所有权限,只保留administrators组和system完全控制权限。
# IIS禁止日志记录

这两条完全是误导,而且按照第一条配置的话,ASP.net运行会出错


除非把ASP.net配置成模拟administrators的权限,这样就不会出错,顺便引入一个极大地安全漏洞。

 回复 引用 查看   
#31楼2010-08-07 22:25 | -brian-      
不错,虽然现在是硬件时代,但是程序优化好了,性能能提升很多
 回复 引用 查看   
#32楼2010-08-07 22:38 | th886      
还可以吧,觉得也不全对。
 回复 引用 查看   
#33楼[楼主]2010-08-07 23:11 | 熊哥      
引用lykyl的自留地:
我只看了服务器优化这部分。可以很肯定的说,如果按你说的那么配置不是正确的。

# 去掉每个磁盘的所有权限,只保留administrators组和system完全控制权限。
# IIS禁止日志记录

这两条完全是误导,而且按照第一条配置的话,ASP.net运行会出错


IIS日志每天可生成1G IO操作太平凡,出错可以在系统日志里查.

IIS7.5标识使用ApplicationPoolIdentity,给目录权限用户是:IIS AppPool\站点名
去掉每个磁盘的所有权限,只保留administrators组和system完全控制权限。当然C盘不能这么设置.

 回复 引用 查看   
#34楼2010-08-07 23:50 | 雪雁      
Ajax请求要使用POST不要使用GET。这个有问题,应该是恰恰相反。因为POST比GET多出了一个发送数据的步骤。只是使用post更安全。
 回复 引用 查看   
#35楼2010-08-08 11:07 | 期待着      
学习了
 回复 引用 查看   
#36楼2010-08-08 16:32 | IT鸟      
不同意见很多啊
 回复 引用 查看   
#37楼2010-08-09 08:52 | 四喜      
如果并发量大的话,建议不要把背景图片分割成一个个的小的图片。这样会大大增加连接数。如同把JS文件合并并压缩是一个道理,虽然第一次加载页面的时候可能稍微有点慢,但是再次访问的时候就会读缓存了。
 回复 引用 查看   
#38楼2010-08-09 10:27 | louise135      
@zyip
用or的话会产生剩余谓词 索引命中不了。
查询的时候你可以把各种分支通过
select c1 from t where c1=1
union all
select c1 from t where c1=2

要比
select c1 from t where c1=1 or c1=2
查询的效率高

 回复 引用 查看   
#39楼2010-08-09 10:58 | Jela      
你好,请问下:
1. 为什么“多使用DbDataReader,尽量不要使用DataTable/DataSet读取数据。”?
2. datareader和dataset都是弱类型的,像datareader在填充List<T>同样存在转化异常。就这一点上,datareader和dataset有什么区别?

 回复 引用 查看   
#40楼[楼主]2010-08-09 14:39 | 熊哥      
引用Jela:
你好,请问下:
1. 为什么“多使用DbDataReader,尽量不要使用DataTable/DataSet读取数据。”?
2. datareader和dataset都是弱类型的,像datareader在填充List<T>同样存在转化异常。就这一点上,datareader和dataset有什么区别?


你可以测试一下 分别用DbDataReader/DataTable/DataSet读一次数据和遍历 看看哪一个快。
给重要的数据填充List<T>然后CACHE起来,毕竟List<T>有LINQ。扩展又好。用起来又方便。比你操作DataTable/DataSet要方便很多。

 回复 引用 查看   
#41楼2010-08-09 16:45 | aGan@net      
@叶子绿了
菜单-〉生成-〉配置管理器-〉找到你的项目,“配置”改成Release,这样你的Web项目就是以Release编译了

 回复 引用 查看   
#42楼2010-08-10 16:47 | lykyl的自留地      
"IIS日志每天可生成1G IO操作太平凡,出错可以在系统日志里查."

对外服务的网站日志是必须要有,以备日后入侵检测以及安全分析用。日志文件每天1GB,日均PV估计在8W以内,开日志影响不大。

 回复 引用 查看   
#43楼2010-08-11 11:03 | 埃斯皮点奈特      
关于数据库优化,总结的很好。受益良多,多谢博主
 回复 引用 查看   
#44楼2010-09-14 13:56 | ice6      
@Soli
赞同!
len=数组.Lenght 这个无所谓的,编译器会自动绑你转的

 回复 引用 查看   
#45楼2010-11-10 11:32 | fanly11      
居然无意之间访问到你的站。。
正确写法:string s = string.Empty; for (int i = 1; i < 10; i++) { s = i.ToString(); }

StringBuilder sb=new StringBuilder;for(int i=1;i<10;i++){ sb.Append(i.ToString());}
应该这样吧。。
其实对于中型企业的数据架构来说优化SQL,sql语句应该是从下往上从右往左执行的,所以建了索引的字段,查询的时候应该放到右边。。如果非要用到left join,right join, 尽量把主表的数据筛选到最少。
其实还可以利用表分区的形式进行优化,或者数据分区的形式。。
就比如可以这样。。
select a,b,c from
Database.dbo.table
union all
select a,b,c from
Database.dbo.table



 回复 引用 查看   
#46楼2010-11-10 11:39 | fanly11      
引用lykyl的自留地:
"IIS日志每天可生成1G IO操作太平凡,出错可以在系统日志里查."

对外服务的网站日志是必须要有,以备日后入侵检测以及安全分析用。日志文件每天1GB,日均PV估计在8W以内,开日志影响不大。

说的不错。。但是我觉得还应该多一个网站错误日志。。可以跟踪网站的稳定性

 回复 引用 查看   
#47楼[楼主]2010-11-10 13:06 | 熊哥      
引用fanly11:
居然无意之间访问到你的站。。
正确写法:string s = string.Empty; for (int i = 1; i < 10; i++) { s = i.ToString(); }

StringBuilder sb=new StringBuilder;for(int i=1;i<10;i++){ sb.Append(i.ToString());}
应该这样吧。。
其实对于中型企业的数据架构来说优化SQL,sql语句应该是从下往上从右往左执行的,所以建了索引的字段,查询的时候应该放到右边。。如果非要用到left join,right join, 尽量把主表的数据筛选到最少。
其实还可以利用表分区的形式进行优化,或者数据分区的形式。。
就比如可以这样。。
select a,b,c from
Database.dbo.table
union all
select a,b,c from
Database.dbo.table



嗯 说的很对。