数据库性能优化
以下章节我们结合一些具体建议和案例来说明如何针对数据库的使用进行性能优化:
1.优化数据库配置实践
数据库的配置参数应从具体业务诉求着手,根据实际需要进行设计;华为云在各个数据库云服务中均提供了默认的配置参数,以满足最普遍的业务需要。
华为云提供了多款数据库服务,不同服务的优化方式和注意事项均有差异,此方面需求,建议使用华为云提供的专业服务。
2.观测性能指标实践
性能监控有助于实时了解业务和系统的负载情况以及资源使用情况,结合告警规则的设置,云服务可自动对负载异常部分进行告警,以便更好地使用和维护云数据库系统。以GeminiDB 为例,您可以通过管理控制台,直观地查看GeminiDB Redis的各项监控指标。
3.设置数据分区实践
GaussDB数据库支持的分区表为范围分区表,列表分区表,哈希分区表。分区表和普通表相比具有如改善查询性能、增强可用性、便于维护、均衡I/O等优势。
普通表若要转成分区表,需要新建分区表,然后把普通表中的数据导入到新建的分区表中。因此在初始设计表时,请根据业务提前规划是否使用分区表。
4.GaussDB SQL语句调优实践
根据数据库的SQL执行机制以及大量的实践,总结发现:通过一定的规则调整SQL语句,在保证结果正确的基础上,能够提高SQL执行效率。如果遵守这些规则,能够大幅度提升业务查询效率,如使用union all代替union、join列增加非空过滤条件、not in转not exists等都可以提升查询速度。
5.GaussDB语句下推调优实践
目前,GaussDB优化器在分布式框架下制定语句的执行策略时,有三种执行计划方式:生成下推语句计划、生成分布式执行计划、生成发送语句的分布式执行计划。在第3种策略中,要将大量中间结果从DN发送到CN,并且要在CN运行不能下推的部分语句,会导致CN成为性能瓶颈(带宽、存储、计算等)。在进行性能调优的时候,应尽量避免只能选择第3种策略的查询语句。
执行语句不能下推是因为语句中含有不支持下推的函数或者不支持下推的语法。一般都可以通过等价改写规避执行计划不能下推的问题。
语句下推典型场景包含单表查询语句下推与多表查询语句下推,一些特殊场景如语句中带有with recursive子句,列存表等不支持下推。
6.GaussDB子查询调优实践
应用程序通过SQL语句来操作数据库时会使用大量的子查询,这种写法比直接对两个表做连接操作在结构上和思路上更清晰,尤其是在一些比较复杂的查询语句中,子查询有更完整、更独立的语义,会使SQL对业务逻辑的表达更清晰更容易理解。GaussDB根据子查询在SQL语句中的位置把子查询分成了子查询SubQuery、子链接SubLink两种形式。
7..GaussDB算子级调优实践
一个查询语句要经过多个算子步骤才会输出最终的结果。由于各别算子耗时过长导致整体查询性能下降的情况比较常见。这些算子是整个查询的瓶颈算子。通用的优化手段是EXPLAIN ANALYZE/PERFORMANCE命令查看执行过程的瓶颈算子,然后进行针对性优化。
读写分离是指通过一个读写分离的连接地址实现读写请求的自动转发。创建实例后,您可以开通读写分离功能,通过GaussDB(for MySQL)的代理地址,写请求自动访问主节点,读请求按照读权重配比或者活跃连接数情况分发到各个节点。
开通读写分离时,需选择加入代理的节点(包括主节点和只读节点)。
9.GaussDB(for MySQL)持锁长事务导致后续业务报等锁超时的解决实践
由于持锁长事务长时间未提交或回滚导致后续操作阻塞,如果持锁长事务已经阻塞了后续的业务,需要将长事务KILL,后续业务侧尽量避免持锁长事务。
10.GaussDB(for MySQL)长事务产生大量临时表导致内存超限的解决实践
考虑升级实例规格,将内存利用率维持在合理范围,防止业务突增导致实例OOM,或根据业务实际情况优化慢查询。
11.GaussDB(for MySQL)联合索引设置不当导致慢SQL的解决实践
查询变慢首先确认是否由于CPU利用率达到性能瓶颈导致执行慢,考虑升级资源规格;或是库表结构设计不合理,索引缺失或索引设置不恰当,应进行语句调优。
12.GaussDB(for MySQL)使用INSTANT方式快速添加列
云数据库 GaussDB(for MySQL)兼容开源MySQL 8.0.22,支持使用ALGORITHM=INSTANT快速添加列,避免造成锁等待影响业务或者SQL执行超时无法新增成功。
13.DAS数据诊断优化性能问题实践
DBA智能运维功能基于运行数据结合算法对实例进行诊断,并对异常项提供具体的诊断结果以及优化建议。
14.观测性能指标(GaussDB为例)
指标ID |
指标名称 |
指标说明 |
rds001_cpu_util |
CPU使用率 |
该指标用于统计测量对象的CPU使用率。 |
rds002_mem_util |
内存使用率 |
该指标用于统计测量对象的内存使用率。 |
rds003_bytes_in |
数据写入量 |
该指标用于统计测量对象对应VM的网络发送字节数,取时间段的平均值。 |
rds004_bytes_out |
数据传出量 |
该指标用于统计测量对象对应VM的网络接受字节数,取时间段的平均值。 |
iops_usage |
IOPS使用率 |
当前IOPS与磁盘最大IOPS比值。 |
rds007_instance_disk_usage |
实例数据磁盘已使用百分比 |
该指标用于统计测量对象的实例数据磁盘使用率,该值为实时值。 |
rds010_disk_usage |
磁盘已使用百分比 |
该指标用于统计测量对象的节点数据磁盘使用率,该值为实时值。 |
更多指标与其他数据库指标信息可参考官方文档。