您的位置:首页 > 其它

从浏览者访问网页的流程来看如何提高系统反应速度(2)--服务端网页的执行

2008-12-30 17:37 429 查看
从浏览者访问网页的流程来看如何提高系统反应速度(2)--服务端网页的执行

从浏览者访问网页的流程来看如何提高系统反应速度(2)--服务端网页的执行

服务端程序的执行,大体包含以下几个大步骤:

1、初始化页面
2、接收并处理传入的参数
3、生成查询语句(或调用外部webservice的地址)
4、开始查询(或开始调用外部webservice)
5、输出查询结果
6、清理页面

在这些步骤中,目前看来对运行速度影响最大的是第3、第4步

所以对页面的优化就集中在这两步

首先注意,如果是调用外部的webservice,如果那个webservice反应比较慢,则页面也会很慢,在调试时要注意设置调用超时,否则页面很可能会无限期等待,在调试页面时要特别注意

如果是数据库查询,则查询语句的编写很有讲究,系统的大部分优化工作都在这里。

如何编写良好的查询语句

一个不好的(或者说慢的)查询,不外乎两个原因:
1、数据库做了不必要的计算来得到结果(比如汇总等),对此的建议是尽量让计算由前台程序来完成
如果需要把大量数据返回给前台程序才能完成计算,比如汇总,也可以考虑在数据库端完成
对于汇总等的计算,最好的建议是尽量在平时就做好汇总并保存好结果,而不要在查询时再做
2、必定是做了大量的磁盘读(写),上一点提到的汇总操作也会导致这个结果
据说一个好的查询,必须要在200ms内完成
所以数据库的优化,说到底主要就是减少磁盘的无效io,升级增加硬件只是加速了磁盘io,对消除无效的查询io没有用处

实际要做的,就是设计合理的数据库结构,和建立合适的索引

合理的数据库结构,是查询优化的基础,否则索引再多也没用(索引也不能太多,一个表的索引最好不要超过10个,否则会影响数据的更新效率)
数据库的设计一定是为了将来的查询,而不能一味的追求所谓的几个范式,范式的主要目的是消除数据的冗余,便于数据的更新和统一。而优化的很多步骤,恰恰是要增加冗余,来减少查询时的多表关联,这跟做缓存的目的一样,都是用空间来换时间

对于单表查询,只要有合适的索引,查询一般都没问题

对于多表关联查询,优化的关键就是尽量让条件字段和排序字段集中在一个表中,而不是由几个表的条件字段组合来决定结果,因为这样的话,表和表之间的相关行就要进行连接,而这里面的很多连接很可能是没用的,因为不组合就无法知道是否符合条件(连接的动作也是消耗资源的)。但如果我们把条件字段在关键表中做适当冗余,就可以避免这种大量的连接,这样在关键表上建立合适的索引就基本可以决定查询结果了,减少了很多无谓的连接,也就减少了磁盘io。如果参与查询的表是很大的表,这种连接是很消耗资源的。所以在系统运行初期,这种问题不容易发现,因为数据量太小,这是很多系统优化的关键地方。

做到了以上的,下面就开始考虑如何在某个表上建立索引以及如何让索引发挥作用
常见的索引的类别:
1、聚集索引
2、非聚集索引
3、覆盖索引
4、索引视图

聚集索引就是决定表中的记录在磁盘上按何种顺序保存的索引(每个表只能有一个),不同记录的字段值是可以重复的。主键就是聚集索引,但它是一种特殊的聚集索引,因为主键是不允许重复的聚集索引。对聚集索引的查询其实就是查询数据表本身

非聚集索引是另外保存的只含有某个数据表的索引相关字段的“表副本”,他的存放顺序由建立索引时的字段顺序决定,针对某个非聚集索引的查询并不查询数据表本身,因为非聚集索引是另外占用磁盘空间的。
某个表在有主键时,他的非聚集索引的每条记录跟物理表是通过主键来关联的,所以推荐每个表都建立主键

覆盖索引是一种特殊的非聚集索引,它其实就是针对某个查询,其所含有的索引字段已经完全包括了返回的字段、条件字段和排序字段,也就是说,只要查询这个索引,而不用查询数据表本身就已经可以得到查询结果了

索引视图其实就是对视图建立的索引。视图本身只是个封装好的查询计划,在实际使用时,每次都是要进行查询的,而对某个视图建立了索引,其实就是把该视图的查询结果物理存储到磁盘上了,并且这个结果会随数据库的更新而自动更新,一般用于将做汇总统计的视图物理化,加速查询。但在建立索引视图时会有条件限制,且更新时也会消耗数据库资源,一般不建立

建立索引的一些原则是:
1、不在重复率很高的字段上建立,比如性别字段
2、先是条件字段,然后是排序字段(根据查询语句的要求合理设置个字段的升降序,如有需要)

如何有效的利用已建立的索引
1、确保索引就是根据查询语句的条件和排序建立的,并且索引的第一个字段就在查询语句里作为条件字段
2、在查询语句的条件或排序里不要出现计算函数等不确定值,最好在平时都先计算好并把计算结果都保存到对应的字段里
3、不要用not、!、or、<>号等符号
4、在不确定符合条件的记录数的多少时,不建议用like符号来匹配文本,如果除了like,还有其他明确的条件也可以先限定只返回少量的待筛选的记录,则在这些少量结果里可以使用like符号

如何有效的减少无谓的查询带来的磁盘读取
1、不使用select *
2、多用select top n
3、使用set rowcount n开关
4、将查询拆解,先查符合条件的记录的主键,再根据这少量的主键查询其他相关信息

超级重要的两个技巧:
1、查询提示小技巧with (nolock),对绝大部分查询,在表名字(或别名)后面都可以加上with (nolock)查询提示来减少阻塞和死锁(注意这并不是优化了查询)
2、对于复杂的查询,可以在查询语句里包含这个语句所在功能页面和函数的注释语句,便于快速定位了解该语句的执行页面和环境

缓存(静态化)的建立:
1、对整页面的缓存
2、对页面模块的查询结果的缓存
缓存注意事项
1、磁盘缓存文件的目录分布
2、磁盘读取速度
3、缓存时间的控制
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: