重庆总部电话:88888888
重庆总部电话:88888888

亚星管理平台

19年
互联网应用服务商
请输入搜索关键词
知识库 知识库

亚星管理平台菁思福知识库

探索行业前沿,共享知识宝库

网站性能越来越差怎么办?
发布日期:2024-10-22 09:00:31 浏览次数: 848 来源:奇龙软件开发

你的老板或客户,是否曾和你抱怨公司的网站性能愈来愈差?网站大家都会写,自从有了 Visual Studio 之后,连你家楼下的正妹小喵和隔壁的王大婶都会写 ASP.NET。但同样的一个画面,背后的性能却可能是天差地远,更惶论多人同时上线的企业网站,而程序员的身价也因此有所差别。本帖提供一些改善网站性能的点子,从硬件、软件、程序技巧的层面都有,也欢迎大家分享自己的经验或秘技。

(1) 重新调整或重新设计 DB schema、索引 (index)

一个在线系统的性能不佳,主要原因都是来自于数据库规划及 SQL 语句层面,至于 .NET 程序撰写不良都还在其次。

先将数据库适度地做正规化,如:一个 Table 中,避免把常用的字段、很少用的字段,都塞在同一个表中,而影响数据扫描的速度。应该将很少用的字段,另切割出来成为另一个表。

(2) 改写 SQL 语句,注意 index 是否在查询时有真的被用到

* 同样的功能,一个不良的「关联子查询」和良好的「独立子查询」,之间的 SQL 性能差距,是不到一秒钟和好几分钟以上的差距。

子查询有分「关联子查询 (correlated subquery)」、「独立子查询」,前者应尽可能少用。以下两句 SQL 语句功能相同,都是要找出每位客户最近一笔订单的日期:

前者每次处理一笔记录时,都会执行一次内部查询 (关联子查询),有点类似双层循环 (loop),会导致性能大幅低落;有经验的 SQL 程序员,会改用后者 JOIN + GROUP BY 的做法,因为这样做,不会执行任何内部查询,会比前者更有效率。

当两个表的记录笔数越多时,在较极端的情况下,性能的差距,就会是不到一秒钟,和十几分钟的差别。


* 一些 SQL 关键词,只要一出现在 SQL 语句中,就可能造成表的「索引 (index)」完全失效或部分失效,变成要整个表去逐行逐列地扫描,
例如: NOT、NOT IN、!=、<>、OR ...等关键词,
还有「LIKE '%关键词'」的模糊查询,也会造成索引失效,但「LIKE '关键词%'」就不会造成索引失效。

(3) 使用 Native 的 DataProvider

放弃 OleDb,改用 ADO.NET Native 的 DataProvider,如: SqlClient、OracleClient。但若您公司坚持要用 Sybase 这种从 2003 年之后,就不曾更新 DB driver 的数据库,就只好继续用性能不佳的 OleDb 去联机了。

据版工我用 Visual Studio 内建的 stress test 工具,测试 OleDb 和 SqlClient 的性能差距,模拟 30 人同时上线,用浏览器撷取一万笔数据,两者的速度就差了一秒钟;且当数据库的数据越多,或越多人同时上线时,性能差距会更明显。

(4) 用程序或软件做缓存

用程序做缓存,如 ASP.NET 从 1.x 时代,就已内建的 Cache (缓存) 机制;或用一些第三方的辅助软件、Framework,这方面若有其它网友知道好用的软件,亦恳请留言告知。

(5) 用硬件做快取或缓冲、砸钱加装 AP Server

面对网站一堆问题,陈xx也决定要将网站再次大幅度调整,将之前的网页程序,以及 SQL 查询语句全部重写,他们花了三个月的时间执行。

陈xx还在原本的网页服务器,与数据库服务器的架构中,加入一组应用程序服务器,作为网页服务器 cache 数据的来源。

改版之后的新网站,搜寻速度提升许多,先前每日的统计数据中,处理速度超过 3 秒的数据超过 50 万笔;而改版后,每星期超过 3 秒的查询不到 10 笔,而这少数反应速度不够快的查询,也多是内部作业执行大量批处理导致的。

由于原本使用的 L4 Switch 较为老旧,负载量比较差,因此陈xx选择将它汰换新的设备,加强负载量;恰好那时正好准备将应用服务器的架构上线,就藉此机会将网络架构更新。陈xx说,这样的架构搭配负载较强的 L4 交换器,强化网站的处理性能,并凭借此抵御网络攻击。在此之后,网站依然会受到零星攻击,但都不会对造成太大影响。

(6) 用硬件做快取或缓冲、砸钱加装 AP Server

数字之墙 - 网站外销的个人实践(二)运营 

以下引用自原文:

全盛时期,来自美国 blog 的流量每天达 80 万次。这个数字其实不高,对程序高手来说是小菜一碟,但笔者是半吊子工程师,知识有限也因此可能程序写得不好,频频被主机供货商发信警告,要求改善网站系统性能。最后,我决定开发 cache system。

cache system 缓存系统上线后,将数据库读写,从每天 80 万次降低到每天 16 万次。这期间也请高手朋友帮忙进行数据库结构优化,帮助很大。笔者在过程中学习到,一个良好的「缓存系统 (cache system)」对于提供 Widget 功能的网站来说非常重要。

…中间略…

能够做到随时搬迁整个网站到另一家主机供货商,除了程序本身的调整外,还要归功于网站管理软件的盛行。在此要推荐的一套称为 Plesk 的网站管理软件。有的主机供货商会直接帮你安装 Plesk ,免费或另外付费。 Plesk 的所有管理功能都是透过 Web 界面,方便到无以复加,大大降低对技术能力的要求。

除了 Plesk 以外,网站管理软件还有其它选择。还有 WHM 加上 cPanel 的组合,也是常见的网站管理解决方案。不过笔者还是比较偏好使用 Plesk,毕竟使用起来容易,也难怪他们的市场占有率一直是独大。只是,功力高的工程师可能会喜欢 WHM + cPanel,因为弹性比较大。不论选择哪一种,都可以帮助你节省许多时间。

(7) 加装实体机器做 Loading Balance (负载平衡)。一些 Server OS 亦内建此类设定功能。

(8) 程序技巧 - ADO.NET

能用 DataReader 就不要用 DataSet / DataTable,前者读取速度快又不耗内存;后者虽较有弹性,但速度较慢又会每个使用者消耗许多内存。若您连 DropDownList 控件的数据来源,都用 SqlDataSource 控件的默认值 - DataSet,则当页面里塞了一堆下拉选单时,性能当然会受影响。

但前提是程序员对 ADO.NET 要有一定程度的了解,若只会用 Visual Studio 透过图形界面,拖拉 TableAdapter、DataTable、.xsd 就免谈了。

若为 DataTable 建立 Primary Key,DataTable 会建立一个索引,追踪新增到 DataTable 中的数据是否符合此条件约束 (constraint)。ADO.NET 2.0 会使用 algorithm 的「红黑树算法 (Red-Black Tree,是一种「平衡树」算法) 去处理索引,让 DataTable 的数据量大时,较方便维护索引;但缺点是建立索引时会降低一些性能。

此外,数据库的访问和捞值,应该尽量在一次 DB connection 做完,一个 connection 可搭配多个 DbCommand 对象使用,不用每次都一个 DbConnection 配一个 DbCommand。

亚星管理平台菁思福科技,优秀企业首选的互联网供应服务商

亚星管理平台菁思福科技秉承"专业团队、品质服务" 的经营理念,诚信务实的服务了近万家客户,成为众多世界500强、集团和上市公司的长期合作伙伴!

亚星管理平台菁思福科技成立于2001年,擅长网站建设、网站与各类业务系统深度整合,致力于提供完善的企业互联网解决方案。亚星管理平台菁思福科技提供PC端网站建设(品牌展示型、官方门户型、营销商务型、电子商务型、信息门户型、DIY体验、720全景展厅及3D虚拟仿真)、移动端应用(手机站APP开发)、微信定制开发(微信亚星官网、微信商城、企业微信)、微信小程序定制开发等一系列互联网应用服务。


我要投稿

姓名

文章链接

提交即表示你已阅读并同意《个人信息保护声明》