数据库性能优化之分布式数据库结构设计优化(一)

Gauss是基于PostgreSQL基础之上研发的MPP数据库,MPP指大规模并行处理架构,在非共享集群中,各独立节点通过网络进行数据通信协同计算,非共享集群有完全可伸缩性、高可用、高性能等优势。Gauss采用了Share Nothing架构,即集群各节点相互独立有独立内存、CPU、磁盘,各节点通过专用网络协议通信,节点下的处理结果将向上层汇总或在节点间流转,在物理存储上的水平分割可以大幅提升数据库的处理能力和容量,主要介绍下相关的调优手段及优化常识。

表结构设计

对于数据量较大的数据结构设计来讲,主要从水平拆分和垂直拆分来考虑对数据库进行拆分来降低表数据量,一般较为常用的为水平拆分,分库分表分区为主要的拆分手段,水平拆分的实现是通过物理分割,将同一单元内的数据量降低突破单机数据库瓶颈极限。

水平分库: 一般是将数据量到达极限的数据库中的数据拆分到新建立的其他服务器的新库中,逻辑上两个库的数据为连续,实际存储分离。

水平分表:一般是将单表数据量极大的大表拆分到多个表中,减少单表的数据量,提升扫描性能,在全表扫描的场景下可以大幅度提高性能。

水平分区:一般是将表数据进行分区,相关的数据文件和索引会存储在不同磁盘上,分区一般分为哈希分区、范围分区、列表分区、数值分区。常用的一般为范围分区和哈希分区,范围分区根据指定字段将元组分为多个范围,范围在不同分区内没有重叠,使用where条件对分区列进行数据筛选时,将会根据条件在指定分区进行扫描,大大减少了扫描的数据量。哈希分区根据字段的散列值将数据均匀地分布在多个分区中,一般使用范围分区较多,将记录的值按时间范围或者数据的数值范围分区,有选择性的对字段较为集中的值进行分区大大提高查询效率。

垂直拆分在数据库优化中比较少,垂直拆分主要是将表数据中的字段进行拆分,将表字段较多的大表中不常用数据拆分成多张表,数据查询通过关联的方式将数据整合到一起,所以垂直拆分主要是通过业务逻辑将数据拆分,有效减少大表的实际数据。

Gauss的数据处理能力依托于MPP大规模并行处理,也就是分布式集群的计算能力,对于分布式数据库而言,最为重要的是数据分布、负载均衡,对于数据处理而言需要考虑的就是如何防止数据倾斜导致的单机极限瓶颈,Gauss可以通过节点表来查询表在每个节点存储的数据量,来判断是否存在数据倾斜,我们对于数据倾斜的标准判断为10%即数据节点最大值-最小值/节点数据平均值 > 10%,判定为表数据倾斜,表数据倾斜会使Gauss需要在节点流转的处理上花费更长时间,还有可能因为任务并发执行导致的通信阻塞,影响集群的正常运行甚至宕机。Gauss新建表需要选择表分布方式,hash分布和replication复制两种,hash分布指定一个或多个字段按照其散列值将数据均匀分布在多个数据节点,这就要求指定的分布列的值尽可能离散,尽量选择数据基值较高的列作为分布列,可以保证数据分布较为均匀避免出现严重的散列冲突,对于全表扫描、数据关联等场景会提供较好的节点数据流转能力,eg:选择条码、ID号等唯一识别的数据,或当不具有唯一键时选择多个列作组合分布列进行数据分布。当数据量较小时,没有必要将数据分布到所有节点,可以选择建立复制表的方式,复制表指由于节点数据不共享会将表数据在各份节点进行存储即以空间换时间,集群节点较多且数据较大会造成空间浪费的情况,复制表的好处是当用到复制表时不需要从其他节点获取对应数据扫描当前节点就可获取所需数据,减少了数据流动可能造成的阻塞、延迟的情况。
然后就是存储方式的选择,列存|行存
图片转载,侵权即删。

图片转载,侵权即删。

由上图可看到,行存与列存按照字面意思理解就为按行存储和按列存储,按行存储就是将以行为单位的数据连续存储,数据读取时需将所有行数据读出I/O上会有浪费,按列存储为将数据列连续存储,数据读取时可以按照字段对需要列进行读取,不需要读取多余数据,减少数据块读取提高查询速率,也可以进行数据压缩节省存储空间,但当数据需要增删时,需要较行存更多的I/O。

猜你喜欢

转载自blog.csdn.net/qq_35996269/article/details/113792549
今日推荐