#应用性能调优
# 系统架构
桥梁设计中桥梁的强度取决于最薄弱的部分,性能设计与之类似,应用系统自顶向下的每一层组件都需要满足性能要求。用户需要考虑不同的负载场景来设计不同组件的架构,主要包含硬件架构和软件架构两部分。
硬件架构
与数据库性能相关的硬件架构,在设计时应该主要考虑以下几个因素:
- CPU:决定数据库的执行能力和并行处理能力。
- MEMORY:数据库使用大量的内存来缓存数据,以减少I/O访问。
- I/O:不同磁盘性能差异很大,有些磁盘还可以提供容错能力,需要根据数据库的需求来选择。
- NETWORK:决定数据库的通讯效率,要重点关注带宽和迟延。
软件架构
通常情况下,应用系统都包含以下软件组件:
- 用户接口
- 业务逻辑
- 资源管理
- 事务处理
用户在设计这些软件组件时,也应当考虑数据库的性能,原则是尽量降低数据库压力。
# 应用设计原则
数据模型设计
应用通过创建数据库表,来规划设计业务的数据模型与关系。不合理的数据模型设计,会对数据库的性能产生很恶劣的影响,后期也很难通过SQL来优化。在设计YashanDB的数据模型时,通常需要注意以下几点:
1.选择合适的表类型:
对于海量稳态数据的分析业务,建议使用LSC表,通过稀疏索引,条件下推,数据压缩等关键技术,实现极致的查询性能。
对于实时分析的业务场景,可以选择TAC表,TAC表支持索引,支持in-place update,拥有向量化计算能力,可实现数据的快速更新和查询。
对于交易性的业务场景,可以选择HEAP表,实现高并发在线事务处理的极致性能。
2.建立合理的索引:
- 合理设计索引列,避免表上的列被多个索引反复包含。
- 创建联合索引时要注意字段排列顺序,把过滤最多记录数的字段放在第一位。
3.选择合理的数据类型:
- 选择更“小”的数据类型,例如INT类型会比NUMBER类型的性能更高。
- 选择合适的数据类型,例如对于字符串类型,如果数据的长度差异比较大,建议使用VARCHAR,节约空间,且对IO压力小;如果数据都是定长或者非常接近,建议使用CHAR,有特殊的性能优化效果。
4.选择合理的表分区属性:
- YashanDB支持哈希分区、范围分区、列表分区。
- 通过分区剪枝的特性,在数据访问的时候可以快速过滤数据,大大减少访问的数据量,提升性能。
- 通过分区特性,可以更好的提升并行扫描的能力。
5.分布式部署中选择合理的表分布属性:
- 对于数据量不大的表,可以考虑创建为复制表,减少跨节点Join。
- 根据数据分布和访问的均衡度考虑确定分区键,可以充分利用各数据节点资源,提升性能。
- 充分利用分布剪枝的特性,该特性在数据访问的时候可以快速过滤数据,大大减少访问的数据量,提升性能 。
系统开发架构设计
在任何系统的设计和架构搭建阶段,都应该确保开发人员充分关注SQL的执行效率。
系统开发架构需要遵循以下两点建议:
1.良好的数据库连接管理:
建立数据库连接的代价非常高,而且扩展性很差。因此,应用程序对数据库的并发连接数应该尽可能的少。 对于高并发的系统,应确保数据库连接被池化,通过数据库连接池来复用连接,而不是每次用户请求都重新建立。
2.良好的游标使用和管理:
减少SQL解析和维护数据库连接同样重要。SQL解析通常包含语法解析、语义分析、语法检查、查询重写和查询优化等阶段,解析产生的执行计划将被存储到shared pool中。SQL解析分为硬解析和软解析:
硬解析:硬解析表示一个SQL提交后,在shared pool中没有找到该语句的执行计划缓存,此时数据库将完整地执行SQL解析、分析和检查等操作。硬解析非常消耗资源。
软解析:软解析表示一个SQL提交后,在shared pool找到了上次的执行计划缓存,此时数据库将直接使用缓存去执行SQL语句,这样就省去了解析、分析和检查等步骤,提升了性能。
正因为解析次数要尽可能的少,所以开发者需要设计出能够一次解析、多次执行的SQL程序。通常做法是使用绑定参数,来替换SQL中每次执行都会变化的部分,而不是使用变化的字符串拼接SQL。否则,SQL语句很可能只解析一次,而不会被其他用户重用。
例如,在程序中应避免使用字符串常量SQL:"SELECT * FROM AREA WHERE AREA_NAME = 'Beijing'",而应该使用绑定变量的SQL:"SELECT * FROM AREA WHERE AREA_NAME = :1"。