【软件架构设计(40)】数据库规范化与性能优化
文章目录一、数据库规范化理论1、规范化范式2、范式级别提升的负面影响二、反规范化技术1、反规范化概念2、反规范化技术手段3、反规范化优缺点分析三、数据库索引1、索引基础概念2、索引类型3、索引优缺点4、索引适用场景与创建原则四、数据库分区、分表、分库1、数据库分区2、数据库分表3、数据库分库4、分区和分表对比共性解读差异解读5、分区常见形式范围分区Range Partitioning哈希分区Hash Partitioning列表分区List Partitioning复合分区Composite Partitioning6、分区优点详解五、NoSQL数据库1、NoSQL与关系数据库对比2、NoSQL分类六、联邦数据库1、联邦数据库系统定义2、联邦数据库特征3、联邦数据库分类七、数据库性能优化1、集中式数据库优化2、分布式数据库优化一、数据库规范化理论1、规范化范式规范化是通过逐步消除数据依赖中的不合适部分使关系模式达到不同范式级别以解决数据冗余、插入异常、删除异常等问题让数据库结构更合理、数据更具一致性。2、范式级别提升的负面影响范式级别提升虽然能解决数据冗余和异常问题但也会带来设计复杂度增加、查询性能下降等负面影响。在设计与维护层面高范式对设计专业性和维护成本提出更高要求从低范式向高范式转换时需对关系模式进行细致拆分比如从1NF升级到BCNF要反复分析并消除复杂数据依赖这依赖设计者深厚的专业知识与丰富经验否则易出现判断失误而拆分后的多表结构会使表间关联大幅增加后续维护表结构、约束及关联关系时仅修改一个业务字段就可能涉及多个表的调整既提升了工作量也提高了出错风险。查询环节的复杂度与性能问题同样突出SQL复杂度高高范式下数据分散在多个表中执行查询时需频繁进行多表连接操作例如获取一条完整业务数据可能要关联3-4个拆分后的表这不仅增加了查询语句编写的难度对开发人员的SQL能力要求更高数据量存在大量扫描和匹配操作在数据量较大的场景中多表连接需要大量扫描与匹配操作会显著增加系统I/O与计算消耗导致查询响应时间变长难以满足实时性要求高的业务需求。数据完整性保障的难度也随之加大数据分散事务管理复杂数据分散存储使得多表更新的事务管理更复杂比如一次业务操作需同时更新3个表的数据若事务控制不当极易出现部分操作成功、部分失败的情况直接破坏数据一致性外键约束多易出错表拆分带来外键约束数量的增多维护这些外键关系的正确性与一致性变得更困难一旦外键设置或更新出现疏漏就可能引发数据引用错误造成数据不一致问题。二、反规范化技术1、反规范化概念反规范化是对规范化后的数据库结构进行调整适当增加数据冗余以提高某些查询操作的性能它是规范化的逆过程但不是简单恢复到原始非规范状态。规范化通过逐步消除数据依赖中的不合适部分使关系模式达到不同范式级别如1NF、2NF、3NF、BCNF等以解决数据冗余、插入异常、删除异常等问题让数据库结构更合理、数据更具一致性。一般是将大的关系模式拆分成多个小的关系模式。2、反规范化技术手段反规范化通过主动引入适度冗余或调整表结构平衡数据库查询性能与维护成本常见策略主要包括增加冗余列、重新组表与分割表每种方式均需在性能提升与管理复杂度间权衡。增加冗余列是最直接的反规范化手段具体可分为派生性冗余列与关联冗余列两类。派生性冗余列例如在包含“单价”和“数量”的表中新增“总价”列总价单价×数量查询时无需重复执行乘法运算能直接提升效率但需在“单价”或“数量”更新时同步修改“总价”否则会破坏数据一致性关联冗余列比如在“订单表”中除“学号”外额外增加“姓名”列原本存储于“学生表”可避免订单查询时的表连接操作但同样需保证“姓名”在两表中同步更新防止出现数据不一致。重新组表与分割表则通过调整表的聚合程度优化性能。重新组表是将规范化拆分后的多个小表合并为单一表例如把“用户基本信息表”“用户联系方式表”合并为“完整用户表”减少多表查询时的连接操作尤其适合高频获取完整用户信息的场景但合并后会导致数据冗余增加且插入、删除时需操作更多字段提升了操作复杂度分割表则针对大表进行拆分水平分割按行划分数据如用户表按地区拆分为“长沙用户表”“上海用户表”垂直分割按列划分如将“商品表”的常用字段“名称”“价格”与不常用字段“生产细节”“售后说明”分开存储两种方式均能减少单次查询扫描的数据量加快查询速度但也增加了数据管理难度例如水平分割后需判断数据归属表垂直分割后需处理跨表关联查询。3、反规范化优缺点分析反规范化在提升查询性能的同时也会带来数据冗余、维护复杂度增加等问题需要权衡利弊。反规范化优点连接操作少检索快、统计快反规范化通过增加冗余列等手段减少了表之间的连接操作。在数据库查询中表连接操作通常较为耗时减少连接意味着能更快地获取数据提高检索和统计的速度。需要查的表减少检索容易将原本分散在多个表中的数据整合到较少的表中降低了查询时涉及的表数量使检索过程更简单直接。用户或应用程序无需在多个表之间进行复杂的关联操作提高了数据检索的便捷性。反规范化缺点及解决方案数据冗余需要更大存储空间反规范化通过增加冗余列等方式提高查询性能必然导致数据重复存储占用更多存储空间。插入、更新、删除操作开销更大由于存在数据冗余当进行插入、更新、删除操作时需要维护多个冗余数据位置的一致性。数据不一致可能产生添加、修改、删除异常冗余数据在更新过程中若不同位置的数据更新不同步就会导致数据不一致。可采用触发器数据同步即通过定义触发器在数据发生变化时自动执行相关操作确保冗余数据同步更新也可利用应用程序数据同步在应用程序代码中编写逻辑控制数据更新保证数据一致性。更新和插入代码更难写反规范化后数据结构更复杂存在冗余数据和表间关系变化编写更新和插入代码时需要考虑更多因素如维护冗余数据一致性等增加了代码编写难度。三、数据库索引1、索引基础概念数据库索引是数据库管理系统DBMS为加速查询操作在表中创建的数据结构类似书籍目录能让数据库快速定位数据位置无需逐行扫描全表。它是对数据库表中一列或多列的值进行排序的结构以特定算法优化包含索引列的值键值和指向实际数据记录的指针。工作原理B树一种多叉平衡查找树节点中存储索引值和指向子节点的指针。查找数据时从根节点开始根据索引值与节点中值的比较决定向下搜索的分支直到找到目标值或确定其不存在。B树也是多路平衡查找树内部节点存索引值用于引导查找叶子节点存实际数据记录指针且叶子节点构成有序链表。查找时先在树结构中定位再到叶子节点获取数据指针。范围查询时利用叶子节点有序性可快速遍历。2、索引类型索引按不同维度可分为多种类型每种类型适用于不同的应用场景。按列数分类索引类型定义适用场景特点单列索引基于表中单个字段创建的索引经常依单一字段查询的场景如按姓名列查询多列索引联合索引基于多个字段创建的索引常需多个字段组合查询的情况列顺序重要遵循最左前缀原则按约束分类索引类型定义用途特点唯一索引保证索引列值唯一的索引用于主键和唯一约束字段确保数据唯一性主键索引特殊的唯一索引表中主键列自动创建值必须唯一一个表只能有一个其他类型索引类型定义特点适用场景聚簇索引表中行物理顺序与键值逻辑顺序相同的索引一个表通常只有一个查询多行效率高非聚簇索引行物理顺序与键值逻辑顺序不同的索引叶级节点不包含数据页只含索引行单行检索快全文索引用于文本数据搜索的索引对文本中单词创建清单辅助检索文本内容搜索3、索引优缺点索引在提升查询效率的同时也会占用存储空间并影响数据维护效率。优点类型具体表现效果说明适用场景提升查询效率极大加快数据检索速度尤其大数据量时效果显著频繁查询操作保证数据唯一性确保列值唯一如唯一索引、主键索引数据完整性要求高的场景加速表连接在实现数据参考完整性方面有意义提高多表关联查询性能复杂查询和报表生成优化分组排序减少分组和排序时间提高聚合操作效率统计分析、数据汇总缺点类型具体表现影响说明注意事项占用空间创建索引需占物理空间数据量越大占用越多需要额外的存储成本降低维护效率数据增删改时索引需动态维护影响操作速度频繁修改数据的表需谨慎使用4、索引适用场景与创建原则合理创建索引需要根据查询模式、数据特征和性能需求进行综合考虑。1. 适合建索引经常搜索的列、主键列、外键经常用于连接、需范围搜索的列、需排序的列、where子句中常出现的列。2. 不适合建索引数据量少的表、数据重复且分布均匀的列、定义为text、image和bit数据类型的列、修改性能远大于检索性能的情况。四、数据库分区、分表、分库1、数据库分区将数据库中的大表按一定规则如按时间、按范围、按列表等划分成多个较小的分区逻辑上是一个表但物理上存储在不同位置。比如将用户表按时间分区把一年的数据按月份划分成12个分区。优点类型具体表现效果说明应用示例提升查询性能查询时可快速定位到相关分区减少扫描数据量避免全表扫描提高查询效率查询某月份用户数据只需访问对应月份分区无需扫描全表便于管理维护可单独对分区进行备份、恢复、优化等操作提高运维效率降低维护成本可仅备份近期活跃数据所在分区提高备份效率数据归档方便可按规则将历史数据转移到低速存储设备降低存储成本优化资源利用将冷数据迁移到成本更低的存储介质缺点类型具体表现影响说明注意事项增加管理复杂度需合理规划分区策略管理多个分区提高系统设计和运维难度需要专业的分区设计和管理经验跨分区查询复杂涉及多个分区的查询需额外处理分区间数据整合增加查询复杂度可能影响性能需要优化跨分区查询策略2、数据库分表把一个大表的数据按一定规则如按业务逻辑、按数据特征拆分到多个结构相同的小表中。例如将用户表按国内、国外用户拆分成国内用户表和国外用户表。优点类型具体表现效果说明应用场景减小单表数据量降低单个表的数据规模提高查询、插入、更新等操作效率大数据量表的性能优化优化性能针对不同小表可定制索引等优化策略满足特定业务需求提升针对性性能不同业务模块的个性化优化缺点类型具体表现影响说明注意事项数据关联性管理复杂原表数据拆分后涉及多表关联查询时逻辑更复杂增加查询复杂度可能影响性能需要重新设计查询逻辑维护成本增加需维护多个表的结构、索引等数据同步等操作难度增大提高系统维护难度和成本需要专业的数据库管理技能3、数据库分库将一个数据库中的数据拆分到多个不同的数据库中每个数据库可部署在不同服务器上。比如将电商系统数据库拆分为用户库、商品库、订单库等。优点类型具体说明负载均衡分散数据库负载不同数据库可处理不同业务请求提升整体系统性能高可用性一个数据库出现故障不影响其他数据库正常运行提高系统容错能力便于扩展可根据业务需求单独扩展某个数据库服务器资源缺点类型具体说明跨库事务处理复杂涉及多个数据库的事务操作保证数据一致性难度大管理成本高需管理多个数据库实例包括备份、监控、维护等工作4、分区和分表对比分区和分表都是数据分散存储的技术但在逻辑结构和实现方式上存在差异。共性解读都针对数据表分区和分表操作的对象都是数据库中的数据表。无论是将大表进行分区处理还是拆分成多个小表都是围绕数据表展开目的是优化数据表相关操作和存储。都使用了分布式存储二者都采用分布式存储思想把数据分散存储。分区是将表数据分散到不同分区存储分表是把数据分散到多个表存储避免数据集中存储带来的性能瓶颈。都提升了查询效率通过减少单次查询需扫描的数据量来提升效率。分区可快速定位到相关分区查询分表减小单表规模查询时扫描数据量少从而加快查询速度。都降低了数据库的频繁I/O压力值数据分散存储后I/O操作也分散。分区使不同分区的I/O操作相对独立减少单个存储区域的I/O负载分表将数据分散到多个表降低单个表的I/O压力避免因频繁I/O导致性能下降。差异解读逻辑结构不同分区在逻辑上仍是一张表只是物理存储被划分成多个部分。用户操作时像操作一张完整表数据库管理系统在内部处理分区相关操作。例如按时间分区的订单表查询时无需关心具体分区系统自动定位。分表在逻辑上已变为多张表每张表结构相同但存储不同部分数据。操作时需明确针对哪张表如按地区分表的用户表查询国内用户需访问国内用户表。5、分区常见形式数据库分区有多种实现方式每种方式适用于不同的数据特征和查询需求。范围分区Range Partitioning依据某列或多列组合的值的范围来划分分区。如以日期列划分销售记录表可按年份、月份将不同时间范围的数据分别存储在不同分区。例如图中按ID范围ID5000、ID10000等进行分区。适用场景数据具有明显时间或数值范围特征且常需按范围查询的场景。像订单表按订单时间分区方便按不同时间段统计订单。哈希分区Hash Partitioning使用哈希函数对分区键进行计算根据哈希值将数据分散到不同分区。如对用户表的用户ID列使用Key mod 3取模运算将用户数据均匀分配到3个分区。适用场景希望数据均匀分布避免数据倾斜即数据集中在某些分区且无明显范围查询需求的场景。如大型社交平台的用户数据存储可通过哈希分区让各分区负载均衡。列表分区List Partitioning根据分区键的离散值进行分区。预先定义离散值与分区的映射关系如将城市名称长沙、上海、北京分别映射到不同分区。适用场景数据具有明确离散分类特征的场景。像电商系统中按地区管理用户数据可将不同省份用户划分到对应分区。复合分区Composite Partitioning结合多种分区方式先按一种方式进行粗粒度分区再在每个粗分区内按另一种方式细分。如先按年份对销售数据进行范围分区再在每个年份分区内按月份进行范围分区。适用场景数据特征复杂单一分区方式无法满足需求的场景。例如大型企业财务数据既要按季度做范围分区又要在每个季度分区内按部门做列表分区。6、分区优点详解数据库分区通过多种机制提升系统性能和可管理性。优势类型具体说明存储更多数据突破单个存储设备容量限制将数据分散存储在多个存储单元。例如数据库表数据量超出单个硬盘容量时通过分区可存储在多个硬盘上实现数据量扩展数据管理方便按类别存储在不同分区清理特定数据时可直接操作对应分区。如电商平台按年份分区订单数据清理某年数据只需删除对应分区无需全表筛选大幅简化操作流程提高数据检索效率依据分区规则精准定位数据避免全表扫描显著加快查询速度。如按地区分区的用户表查询某地区用户时直接定位到该分区减少数据检索范围提升查询性能提高查询吞吐量多分区并行查询充分利用多个磁盘的I/O能力显著提升数据读取速度。在大型数据仓库中多分区并行查询可大幅提升复杂查询性能增加单位时间内查询处理量便于聚合函数查询各分区数据相对独立且格式一致可先在各分区内计算聚合结果再合并汇总。如统计各地区销售额总和先分区计算再汇总简化计算过程提高聚合查询效率五、NoSQL数据库1、NoSQL与关系数据库对比NoSQL数据库与关系数据库在应用领域、数据容量、数据类型等方面存在显著差异。对比维度关系数据库NoSQL数据库应用领域面向通用领域适用于各类传统业务场景如企业的财务系统、人力资源管理系统等对数据的一致性、完整性和事务处理要求较高针对特定应用领域如互联网应用中的用户行为分析、实时数据处理等场景处理海量、快速变化且结构多样的数据数据容量在处理有限数据量时表现良好对于小型企业或业务数据量不大的场景能有效管理但随着数据量急剧增长性能和扩展性会面临挑战擅长处理海量数据通过分布式存储和计算架构可轻松应对大数据量的存储和查询需求如大型电商平台的商品信息、用户订单等数据类型主要处理结构化数据以二维表形式存储数据具有固定的模式Schema表中的列和数据类型预先定义好便于进行复杂的关联查询和数据验证可处理非结构化数据如文本、图片、视频等也能处理半结构化数据不严格要求固定的模式数据存储更灵活适应多样化的数据格式并发支持支持并发操作但由于其严格的事务机制和锁机制在高并发场景下可能会出现锁竞争导致性能下降具备高并发处理能力通过分布式架构和优化的存储引擎能更好地应对大量并发请求在互联网高并发访问场景中表现出色事务支持具有高事务性遵循ACID特性原子性、一致性、隔离性、持久性确保数据在并发操作和故障情况下的完整性和一致性适合对数据准确性要求极高的场景事务性较弱通常不严格遵循ACID特性在一些场景下采用最终一致性模型虽然牺牲了部分事务严格性但换来了更高的性能和扩展性扩展方式主要采用向上扩展Scale-up方式即通过增加硬件资源来提升数据库性能和处理能力但存在硬件成本高、扩展上限有限等问题多采用向外扩展Scale-out方式通过增加服务器节点数量来扩展存储和处理能力具有良好的扩展性和成本效益可根据业务需求灵活增减节点2、NoSQL分类NoSQL数据库按数据模型可分为键值型、文档型、列族型和图型四大类。分类存储方式适用场景特点键值型数据库以键值对形式存储数据简单的数据存储和快速查询场景结构简单读写速度快适合缓存和会话存储文档型数据库以文档形式存储数据存储半结构化数据如JSON格式的数据灵活的数据结构支持嵌套文档适合内容管理列族型数据库以列族形式存储数据大数据分析和数据仓库场景高压缩比适合稀疏数据支持大规模数据存储图型数据库以图结构存储数据处理复杂的关系数据如社交网络、推荐系统等擅长处理复杂关系查询支持图算法和路径分析分类代表产品主要特点键值型Redis、Memcached、DynamoDB内存存储高性能支持持久化文档型MongoDB、CouchDB、Elasticsearch灵活的文档结构支持全文搜索列族型Cassandra、HBase、Bigtable分布式存储高可用性适合大数据图型Neo4j、ArangoDB、Amazon Neptune图查询语言复杂关系分析六、联邦数据库1、联邦数据库系统定义联邦数据库系统是由多个彼此协作但又相互独立的成员数据库系统组成的集合通过对成员数据库系统进行不同程度的集成实现数据的统一管理和协同操作。联邦数据库系统FDBS是由多个彼此协作但又相互独立的成员数据库系统CDBS组成的集合。它通过对成员数据库系统进行不同程度的集成实现数据的统一管理和协同操作。联邦数据库管理系统FDBMS则是为整个联邦数据库系统提供控制和协同操作功能的软件。2、联邦数据库特征联邦数据库具有分布性、异构性、自治性和透明性四个主要特征。特征具体说明分布性成员数据库分布在不同物理位置数据存储具有分散性可分布在不同服务器甚至不同地域打破数据集中存储限制异构性成员数据库可以是不同类型的数据库如包含文本文件、MySQL、Oracle等不同数据库管理系统支持不同的数据模型和存储格式自治性各成员数据库在一定程度上保持独立自治有自己的管理和控制机制可独立进行数据操作和事务处理同时又能参与联邦数据库的协同工作透明性用户操作联邦数据库时无需关心数据实际存储位置、数据库类型差异等底层细节就像操作一个统一的数据库提高使用便捷性场景类型应用示例企业数据整合整合财务系统、HR系统、CRM系统等不同数据库跨地域数据访问跨国公司需要访问不同地区的业务数据遗留系统集成将老旧的数据库系统与新建系统整合数据仓库建设从多个业务系统抽取数据进行分析3、联邦数据库分类联邦数据库按耦合度可分为紧耦合和松耦合两种类型。耦合类型具体说明紧耦合成员数据库之间耦合度高相互协作紧密数据共享和交互频繁对联邦数据库管理系统的协调能力要求较高。在这种模式下成员数据库的自治性相对受限更多服从联邦系统整体调度松耦合成员数据库相对独立彼此间耦合度低仅在必要时进行有限的数据交互和协作。成员数据库保留较高自治性联邦数据库管理系统主要起辅助协调作用七、数据库性能优化1、集中式数据库优化集中式数据库优化从硬件系统、系统软件、数据库设计和应用软件四个层面进行综合优化。数据库性能优化方法优化层面具体方法硬件系统通过升级CPU提升运算能力增加内存加快数据读写优化I/O设备如采用高速硬盘、磁盘阵列减少数据存取时间改善网络设备和配置降低数据传输延迟从硬件层面为数据库高效运行提供基础系统软件调整系统参数如设置合理的进程优先级让数据库相关进程优先获取CPU使用权合理分配内存资源给数据库保障其运行流畅应用软件使用数据库连接池复用数据库连接减少连接创建和销毁开销提高应用程序与数据库交互效率数据库设计优化设计方面优化方法表与视图合理规划表结构避免冗余和不合理的关联。建立物化视图将视图结果预先计算并存储可加快查询速度减少实时计算开销索引对于经常用于查询条件的列建立索引能大幅提升查询效率但对于经常进行数据修改插入、更新、删除的列避免建立过多索引因索引维护会增加修改操作开销SQL优化用不相干子查询替代相干子查询减少查询执行时的关联计算只检索需要的列避免返回不必要数据减少I/O和网络传输开销用带IN的条件子句等价替换OR子句优化查询执行计划经常提交COMMIT尽早释放锁资源减少锁等待时间尽量减少多表查询降低查询复杂度2、分布式数据库优化分布式数据库优化主要关注通信代价的降低和查询效率的提升。优化方法具体说明全局查询树的变换对查询树进行优化变换改变查询执行顺序和方式减少数据传输量和网络通信次数多副本策略合理设置数据副本将副本放置在不同节点使查询能就近获取数据减少跨节点数据传输提高查询效率查询树的分解将复杂查询树分解为多个简单子查询树在不同节点并行执行子查询最后合并结果利用分布式计算能力降低整体查询时间半连接与直接连接根据数据分布和查询需求选择合适的连接方式。半连接可先过滤掉不需要传输的数据减少网络传输量直接连接则在某些情况下能更高效地完成数据关联