1.数据库层性能优化
(1)建立合适的索引
- 在原有的索引上,都增加一个tenant_id字段。由于tenant_id的选择性较强,一般tenant_id字段需要作为联合索引的第一个字段
- 所有的业务查询操作,都增加tenant_id字段进行过滤
- 索引应创建在条件(where)、排序(order by)、分组(group by)等操作所涉及的列上。
- 索引应该有较强的选择性,即应尽可能建立在重复数据少的的数据列中。
- 如果多个条件经常需要组合起来查询,应合理使用联合索引
- 一次查询中只能使用一个索引,可使用相应的分析工具分析索引效果
- 索引不是越多越好,过多的索引可能导致CUD(新增、修改、删除)的性能降低,并且占用更多的空间
(2)消除大数据表连接
并不是所有的耗时长的SQL问题都是由索引引起的。索引优化完成之后,就会发现太多的大数据量表连接操作占用了耗时SQL统计中的大部分。
(3)避免复杂SQL
一般需要考虑将复杂的SQL分解成多个简单的SQL执行,将复杂的运算尽量留在应用服务器层
。因为一般情况下,应用服务器层的水平扩展更容易实现,而数据库层的扩展则是比较困难的。
2.应用层性能优化
(1)Cache
采用cache其实也是对数据库的一种优化,因为避免了对数据库的频繁访问。主要针对那些变化相对较少的业务数据。比如用户数据、权限角色数据、国家省市地区数据等做缓存
(2)统计和报表计算
在多租户架构下,由于并发量和数据量的增大,实时计算的统计和报表也将是造成数据库压力过大的一个主要因素。
(3)搜索引擎
(4)异步操作
异步操作使得用户的操作体验得到了极大地提升,同时也能降低系统的并发负载,因此,将同步操作变成异步操作,也是提升性能的一种重要手段。
3.Web层性能优化
(1)web开发的性能优化策略
可参考https://developer.yahoo.com/performance/rules.html
内容类:
- 减少http请求
- 减少DNS查找
- 避免跳转
- 缓存ajax
- 延迟加载
- 提前加载
- 减少DOM元素数量
- 用域名划分页面内容
- 减少frame
- 避免404错误
服务器类与cookie类
- 使用CDN
- 为文件头制定Expire或Cache-Control
- GZIP压缩网页
- 配置实体标签
- 尽早刷新输出缓冲
- 使用Get完成AJAX请求
- 减少cookie体积
- 对月页面内容使用无cookie域名
JS、CS、图片类
- 把脚本置于页面底部
- 使用外部JS和CSS
- 削减JS和CSS
- 剔除重复脚本
- 减少DOM访问
- 开发智能事件处理程序
- 把样式表置于顶部
- 避免使用CSS表达式
- 用link代替@import
- 避免使用滤镜
- 优化图像
- 优化CSS Sprites
- 不要在HTML中缩放图像
- favicon.ico要小而且可缓存
移动应用类
- 保持单个内容小于25KB
- 打包组件成复合文本
虽然这些法则更多的侧重于互联网网站的优化,不过很多内容对于基于web的saas应用同样具有参考价值。
(2)http服务器的性能优化策略
apache、nginx服务器的优化
4.性能监控
通过工具能够实时地统计出应用在各种场景下(不同地区、不同客户、不同页面)的性能数据并及时预警
上图是阿里软件性能中心的截图,该性能中心可以统计出每个请求的服务端响应时间、网络时间和客户端加载时间,并且可以按照页面、用户所在地区、时间等多维度进行统计分析,从而帮助监控应用性能。
参考书籍《互联网时代的革命-SAAS应用架构》