你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn。
适用于此 Azure Well-Architected 框架性能效率清单建议:
| PE:08 | 优化数据性能。 针对工作负荷的预期和实际用途优化数据存储、分区和索引。 |
|---|
本指南介绍优化数据性能的建议。 优化数据性能是优化工作负荷处理和存储数据的效率。 每个工作负荷作、事务或计算通常都依赖于数据的快速准确检索、处理和存储。 优化数据性能后,工作负荷将顺利运行。 数据性能泄露会导致性能效率不佳的多米诺骨牌效应。 未能优化数据性能会导致响应延迟、延迟增加和可伸缩性减少。 它危及整个工作负荷的效率。
定义
| 术语 | Definition |
|---|---|
| CAP 定理 | 一个框架,用于考虑一致性、可用性和分区容错,以帮助解释数据一致性的权衡。 |
| 数据库索引重新生成 | 删除并重新创建索引的维护活动。 |
| 数据库索引重组 | 优化当前数据库索引的维护活动。 |
| 数据存储 | 存储数据库、对象存储或文件共享等数据的资源。 |
| 最终一致性 | 一种数据同步模型,允许在数据副本最终同步之前暂时不一致。 |
| Index | 提供对项的快速访问的数据库结构。 |
| 联机分析处理 (OLAP) | 一种组织大型业务数据库、支持复杂分析的技术,并执行复杂的分析查询,而不会对事务系统产生负面影响。 |
| 联机事务处理 (OLTP) | 在组织的日常运营中记录业务交互的技术。 |
| 乐观并发 | 更新使用快照进行更新的数据库的方法,而不是传统的锁定机制,从而提高性能和可伸缩性。 |
| PACELC 定理 | 一个框架,用于考虑分区容错、可用性、一致性和延迟,以帮助解释数据一致性的权衡。 |
| Partitioning | 以物理方式将数据划分为单独的数据存储的过程。 |
| 查询优化 | 优化数据库查询速度的过程。 |
| 只读副本 | 主数据库的实时副本,可用于从写入数据库卸载读取流量。 |
若要优化数据使用情况,请确保数据存储、分区和索引已针对预期用途和工作负荷的实际用途进行优化。 优化的数据使用情况可以提高查询性能,减少资源消耗,并提高整体系统效率。 请考虑以下策略:
配置文件数据。 了解数据并确保数据模型非常适合工作负荷。 考虑数据规范化、索引策略和分区技术等因素。 若要高效检索数据,请确保选择适当的数据类型、定义实体之间的关系并确定最佳索引策略。
微调数据存储配置。 配置数据存储基础结构,使其符合工作负荷要求。 选择适当的存储技术,例如关系数据库、NoSQL 数据库和数据仓库。 优化存储设置,例如缓冲区大小、缓存机制和压缩。
优化查询性能。 分析和优化在工作负荷中运行的查询。 使用查询优化、索引和缓存等技术。 若要识别瓶颈,请使用查询计划和性能监视工具,然后进行必要的改进。
定期监视和优化系统。 持续监视工作负荷的性能,并循环访问数据存储配置和查询优化。 根据性能优化最佳做法,分析系统指标,确定改进领域,并实施更改。
配置文件数据
数据分析涉及检查源中的数据并收集有关它的信息。 目标是了解工作负荷数据的质量、结构和特征。 此过程允许识别缺失值、重复项、不一致格式和其他异常等问题。 若要进行有效的数据分析,请考虑以下策略:
了解数据结构。 检查数据的结构,包括表、列和关系。 确定应用于每个列的数据类型、长度和约束。 数据结构评估可帮助你了解数据的组织方式以及数据与其他数据元素的关系。
分析数据量。 评估数据量,以了解总体大小和增长模式。 确定记录数或文档数以及单个表或集合的大小。 此信息有助于估算存储要求并识别可伸缩性问题。
标识数据关系。 浏览数据元素之间的关系,例如主键和外键关系。 了解如何连接数据,以便确定一个表或文档中的更改如何影响相关数据。
评估数据质量。 通过检查完整性、准确性、一致性和唯一性等因素来评估数据的质量。 确定可能影响数据完整性和查询性能的数据异常、缺失值或重复记录。 此步骤可帮助你确定数据清理和改进的领域。
捕获数据分布。 分析每个列中值分布以确定数据模式。 识别频繁和罕见的值、离群值和数据偏斜。 若要优化查询性能,请根据分布选择适当的索引策略和查询优化技术。
监视数据性能
数据性能监视是实时跟踪数据存储、分区和索引的效率的做法。 它涉及到收集和分析特定于数据作的性能指标,使用专为系统级别、特定于数据库或第三方监视解决方案定制的工具。 有效的数据性能监视使你能够主动识别和缓解潜在瓶颈,确保数据相关的流程和任务高效。 若要监视数据性能,请考虑以下策略:
收集特定于数据的指标。 收集与数据性能直接相关的关键指标。 这些指标包括查询响应时间、数据吞吐量、与数据访问相关的磁盘 I/O 以及特定数据分区的加载时间。
设置数据警报。 为数据指标专门设置警报。 使用这些指标中的预定义阈值或异常来触发警报。 当性能指标超出可接受的范围或显示异常行为时,警报使你能够接收通知。 例如,如果数据库查询花费的时间超过预期,或者数据吞吐量明显下降,则会触发警报。 可以使用专用监视工具或自定义脚本设置这些警报。
诊断数据性能问题。 定期查看收集的数据指标,以查明数据作的潜在性能瓶颈或降级。 可视化工具或仪表板在此过程中非常有用,有助于突出数据性能的趋势、瓶颈和离群值。 确定后,深入探讨这些问题的根本原因,并制定相应的修正步骤。
将数据分区
分区涉及将大型数据集或大容量工作负荷划分为较小的可管理子集。 分区通过分布工作负荷和改进并行处理来提高数据性能。 它还可确保基于特定需求和查询模式更有效地访问数据。 可以垂直或水平(也称为分片)对数据进行分区。
| 策略 | Definition | Example | 用例 |
|---|---|---|---|
| 垂直分区 | 通过为每个分区选择特定的列或字段,将表划分为较小的表。 每个分区表示完整数据的子集。 | 如果具有列 A、B、C 和 D 的表,则可以使用列 A 和 B 创建一个表,另一个表包含 C 和 D 列。 | - 表包含许多列,但查询不能一起访问所有列。 - 某些列大于其他列,分离列可以提高 I/O 性能。 - 不同的数据部件具有不同的访问模式。 |
| 水平分区 | 根据行或值范围(也称为分片)拆分数据。 每个分区都包含一部分具有类似特征的行。 | 如果有行 1 到 1000 的表,则可以创建一个分区,其中第 1 行到 500 行,另一个分区行为 501 到 1000 行。 | - 对于单个位置或服务器,数据集太大。 - 基于特定范围或筛选器访问数据。 - 需要跨物理节点或服务器分配工作负荷以提高性能。 |
若要对数据进行分区,请考虑以下步骤:
分析数据和查询。 分析数据和查询模式,以确定适当的分区或分片策略。 了解数据、访问模式和分发要求的性质。
确定密钥。 选择分区或分片键以跨分区或分片分配数据。 根据数据特征和查询要求仔细选择密钥。
确定逻辑。 根据所选键确定分区或分片逻辑。 请考虑将数据划分为范围、应用哈希算法或使用其他分区技术。
配置基础结构。 配置数据库系统以支持分区或分片。 请考虑创建必要的基础结构、定义分区或分片以及配置数据分布。
有关详细信息,请参阅 数据分区指南。
优化数据库查询
优化数据库查询使用索引提示和缓存等技术优化查询。 这些调整提高了数据检索的效率和速度。 因此,数据库具有较轻的工作负荷,资源更高效地工作,用户享受更流畅的交互。 若要优化数据库查询,请考虑以下策略:
重写查询。 查看和分析复杂的查询,以确定重写它们的机会。 请考虑调整查询逻辑、消除冗余作或简化查询语法。
避免 N+1 查询问题。 通过使用联接和批处理提取高效检索相关数据,最大程度地减少到数据库的往返次数。
重新排序联接。 评估查询计划,并考虑重新排列联接顺序,以最大程度地减少每个联接作中的行数。 联接表的顺序可能会影响查询性能。
使用索引提示。 使用索引提示,以便数据库引擎可以在运行查询时指定索引的使用。 索引提示引导优化器选择最合适的索引。
缓存查询。 将频繁运行的查询结果存储在内存中。 查询缓存无需重复运行同一查询,并减少了查询处理开销。
优化锁定。 避免查询中不必要的或限制性的锁提示。 高效的锁定策略可以增强查询性能和并发性。 应用数据库系统提供的优化锁定机制。 分析和调整隔离级别,以平衡数据一致性和查询性能。
监视和优化。 监视查询性能指标,例如运行时、资源利用率和查询吞吐量。 使用数据库分析工具和监视功能来识别性能不佳的查询。 根据收集的性能数据评估和微调查询计划。 分析查询计划和等待统计信息,以确定瓶颈。 使用该信息优化查询性能。
优化索引性能
索引通过允许数据库使用特定列或字段快速查找数据来提高数据检索速度。 优化这些索引时,排序和联接作会变得更加高效,从而加快查询速度。 优化好的索引会减少查询所需的磁盘 I/O作。 删除不需要的索引或冗余索引也会释放宝贵的存储空间。 若要优化索引性能,请考虑以下策略:
分析查询模式。 了解在数据库上运行的查询模式。 确定频繁运行的查询,并可能会降低性能。 分析查询模式以确定哪些索引有利于优化性能。
评估现有索引。 查看数据库中的现有索引。 评估查询模式的使用情况、性能影响和相关性。 确定可以删除的冗余索引或未使用的索引以提高写入性能并减少存储开销。
标识用于编制索引的列。 标识查询 的 where、 join 和 order by 子句中经常使用的列。 这些列可能是索引的候选列,因为它们可以启用快速数据检索。
选择适当的索引类型。 根据数据库系统选择适当的索引类型。 常见选项包括用于相等和范围查询的 b 树索引、完全匹配查询的哈希索引,以及文本搜索作的全文索引。 选择最符合查询要求的索引类型。
考虑索引列顺序。 创建包含多个列的复合索引或索引时,请考虑列的顺序。 将最常用于查询的列放在索引的开头。 列顺序有助于确保工作负荷有效地对各种查询使用索引。
平衡索引大小。 避免对具有低基数的列创建索引,或者对具有少量非重复值的列创建索引。 此类索引可能效率低下,并增加数据库的大小。 相反,索引具有高选择性的列。
维护索引使用情况。 持续监视索引的使用情况和性能。 查找根据查询模式或性能要求的变化创建新索引或修改现有索引的机会。 删除或更新不再有益的索引。 索引具有维护开销。 随着数据的变化,索引可能会碎片并影响性能。 定期执行索引维护任务,例如重新生成或重新组织索引,以确保最佳性能。
测试和验证。 在生产环境中修改索引之前,请执行全面的测试和验证。 使用代表性工作负荷衡量索引修订的性能效果。 根据预定义基准验证改进。
权衡:B 树索引的存储开销可能很高,而完全匹配的查询可能很慢。 哈希索引不适用于范围查询或比较运算符。 全文索引可能具有较高的存储要求,非文本数据查询可能很慢。
考虑数据压缩
数据压缩是减少数据大小以优化存储空间并提高工作负荷性能效率的过程。 压缩的数据需要更少的存储空间和更少的带宽进行传输,这会导致数据传输速度很快。 压缩数据以减少存储占用空间并提高数据访问时间。 压缩数据时,它会减少 I/O作和网络带宽要求。
无丢失压缩和丢失压缩是数据压缩算法。 无丢失压缩算法可减小数据大小,而不会丢失任何信息。 丢失压缩算法通过删除不太重要的或冗余的信息来实现高压缩率。
权衡:若要压缩和解压缩数据,需要计算资源,例如 CPU 和内存。 压缩的数据越多,所需的资源就越多。
存档和清除数据
存档和清除是简化数据存储的策略。 存档将较旧的、不太频繁访问的数据重新定位到更具成本效益的存储。 清除数据会永久删除冗余数据。 它们通过减少数据量、提高数据访问速度以及减少备份和恢复时间,从而提高性能效率:
减少数据量:减少数据意味着更快的处理时间,确保快速响应用户请求。
提高数据访问速度:剪裁的数据集允许更快速的查询和数据检索,从而优化系统响应能力。
减少备份和恢复时间:较小的数据集可加快备份和还原过程,最大限度地减少停机时间并确保一致的性能。
存档和清除有助于保持数据驱动系统中的峰值性能效率。
优化存储负载
优化存储负载意味着简化对存储系统的请求。 它有助于消除不必要的请求。 它还增强了数据检索,并防止存储压倒性。 优化存储负载可确保存储系统保持对合法请求的响应并保持峰值性能。 实施策略以减少数据存储的处理负担。 若要优化数据存储负载,请考虑以下策略:
使用缓存
缓存在快速访问存储区域中通常访问的数据,使数据检索比从主源拉取数据更快。 此方法通过减少访问时间并避免重复数据提取来提高数据性能。 缓存可提高读取速度和用户响应时间,尤其是对于经常访问的数据,此方法对很少更改的静态数据或数据最为有效。
为了确保最佳缓存效率,请考虑过期策略、逐出策略和管理缓存大小等因素。 调整设置(例如生存时间(TTL),以获得最佳性能。 若要使用缓存优化存储负载,请考虑以下策略:
内存中缓存:执行内存中缓存,以在内存中存储经常访问的数据,以便快速检索。 可以将此方法用于计算或从数据库检索成本高昂的应用程序数据。 内存中缓存对于经常读取但不会频繁更改的数据非常有用。
数据库查询缓存:使用此技术缓存数据库查询的结果,以避免多次运行同一查询。 数据库查询缓存对于复杂且耗时的数据库查询非常有用。 缓存查询结果时,将快速返回对同一查询的后续请求。
内容分发网络缓存:使用此技术在分布式网络服务器上缓存 Web 内容,以减少延迟并提高内容传送。 内容分发网络缓存对于静态内容(如图像、CSS 文件和 JavaScript 文件)有效。 内容分发网络将内容的副本存储在全球多个位置,以便用户可以从地理上靠近它们的服务器访问内容。
使用只读副本
许多数据库支持多个只读副本。 跨副本分配读取查询,以最大程度地减少对写入数据库的需求。 每个只读副本都可以为一部分流量提供服务,从而提高性能。
如果工作负荷具有希望保持同步的多个数据副本,则使用 PACELC 定理为此分布式系统建模会很有帮助。 PACELC 定理有助于了解系统非分区状态下的延迟与常量权衡选择。 使用此信息可帮助你选择最适合处于分区和非分区状态的系统的数据库引擎和数据同步策略。 有关详细信息,请参阅 命令和查询责任分离(CQRS)模式。
优化数据一致性
在分布式工作负荷中,数据驻留在多个节点或位置的位置中,选择的一致性级别决定了一个位置中更改的速度更快。 选择更严格的一致性会消耗更多计算资源,并会对性能效率产生负面影响。 另一方面,不太严格的一致性级别(如最终一致性)引入了节点之间的临时不一致性,但可以提高性能效率。
最终的一致性在数据准确性和工作负荷性能之间达到平衡。 更改逐渐蔓延,而不是即时传播,从而提高工作负荷响应能力和数据处理速度。 尽管它引入了生存期较短的不一致性,但工作负荷最终在所有节点中呈现一致的数据。 选择最终一致性可以提升工作负荷的性能,并进一步增强其可用性和可伸缩性。
优化数据更新
可以使用乐观并发来处理相同数据的并发更新。 乐观并发允许多个用户或进程并发工作,并假定冲突很少见,而不是锁定数据并防止其他更新。
对于乐观并发,每个更新作都包含一个版本或时间戳,表示更新时数据的状态。 检测到冲突更新时,系统会拒绝更新或合并更改来解决冲突。
乐观并发可最大程度地减少争用,并允许并发更新继续,而无需不必要的锁定。 它减少了资源的等待时间,并提供高吞吐量。
优化数据移动和处理
优化数据移动和处理涉及提高与数据提取、转换、加载和处理相关的作的效率和性能。 请考虑以下优化数据移动和处理的关键方面:
提取、转换和加载 (ETL) 优化:优化 ETL 进程以最大程度地缩短处理时间。 可以简化提取过程,实现高效的转换算法,并优化加载过程。 使每个步骤高效时,可以优化整个工作流。
并行处理:利用并行处理技术来提高性能。 在多个线程或节点之间分配数据处理任务时,可以同时划分和处理工作负荷,从而导致快速处理。
批处理:将类似任务组合在一起,以减少重复作导致的开销。 在批处理中处理多个任务以减少总体处理时间。
优化存储设计
优化存储设计需要创建精确的数据存储体系结构并选择适当的存储技术。 简化的存储设计增强了数据访问、检索和作。 通过战略存储设计,工作负荷可实现改进的响应时间和整体功能。
数据邻近度设计
数据邻近度是指数据与访问数据频率最高的用户或服务更接近的战略位置。 通过减少数据与其用户之间的物理或逻辑距离,数据邻近度可确保更快地访问数据并提高响应能力。 若要优化邻近度的设计,请考虑以下策略:
评估数据访问模式:评估工作负荷的访问模式和经常访问的数据。 此分析有助于确定将数据放置在何处以获得最大好处。
选择支持数据重定位的解决方案:考虑基于更改访问模式提供动态数据重定位的解决方案,确保最佳数据定位。
选择支持数据同步的解决方案:如果满足分布式用户群的需求,请选择有助于跨不同区域的数据同步的解决方案,确保数据副本在靠近用户的情况下可用。
权衡:如果基础数据频繁更改,请实现缓存失效机制,以确保缓存的数据保持最新状态。
使用 polyglot 持久性
Polyglot 持久性是使用多种数据存储技术在应用程序或系统中存储和管理不同类型的数据的做法。 不同类型的数据库或存储解决方案满足不同的数据要求。
Polyglot 持久性利用每个数据存储技术的优势,以确保每种数据类型的最佳性能和可伸缩性。 例如,可以使用关系数据库来存储结构化事务数据。 可以使用 NoSQL 数据库来存储非结构化或半结构化数据。
根据数据的要求为每个数据存储技术设计架构。 对于关系数据库,可以创建具有适当关系的规范化表。 对于 NoSQL 数据库,可以定义文档结构或键值对。 开发必要的组件,以便与每个数据存储技术(例如 API、数据访问层或数据集成管道)进行交互。 确保应用程序可以读取数据并将其写入适当的数据存储。
权衡:具有低规范化的数据结构可以提高性能,但引入了复杂性。
单独的 OLTP 和 OLAP 系统
若要分离 OLTP 和 OLAP 系统,请设计和部署用于事务处理和分析处理任务的不同系统。 这种分离使你可以针对每个系统的特定工作负荷和特征进行优化。
OLTP 系统用于实时事务处理。 它们高效可靠地处理单个事务。 OLTP 系统通常用于执行日常作任务,例如联机订单处理、库存管理和客户数据管理。 OLTP 系统优先考虑响应能力、一致性和并发性。
OLAP 系统用于复杂的分析处理和报告。 它们处理大量数据并执行密集的计算和聚合。 OLAP 系统用于商业智能、数据挖掘和决策支持等任务。 OLAP 系统优先考虑查询性能、数据聚合和多维分析。
分离 OLTP 和 OLAP 系统时,可以分配适当的资源,并针对其特定工作负荷优化每个系统。 通过分离,可以将不同的数据建模技术应用于每个系统。 OLTP 系统通常使用规范化架构进行高效的事务处理。 OLAP 系统可能使用非规范化架构或数据仓库技术来优化查询性能。
Azure 便利化
分析数据:Azure 提供可用于分析数据的工具和服务,例如 Azure 数据目录、 Azure Purview 和 Azure Synapse Analytics。 借助这些工具,你可以从各种源提取、转换和加载数据、执行数据质量检查,并深入了解数据。
监视数据性能:若要监视数据性能,可以使用 Azure Monitor 收集和分析基础结构指标、日志和应用程序数据。 可以将 Monitor 与其他服务(如 Application Insights)集成。 Application Insights 提供应用程序性能监视并支持许多平台。
Application Insights 收集使用情况和性能数据。 可以使用 Log Analytics 将这些数据与 Azure 资源中的配置和性能数据相关联。
可以使用 Azure SQL 和 Azure Cosmos DB 的见解功能来监视数据库。 使用此功能可以诊断和优化数据库性能问题。
分区数据:Azure 为不同的数据存储提供各种分区策略。 每个数据存储可能有不同的注意事项和配置选项用于数据分区。 有关详细信息,请参阅 数据分区策略。
优化数据库查询和索引性能:使用 Azure SQL 数据库的查询性能见解功能优化查询、表和数据库。 可以使用此功能来识别和排查查询性能问题。
对于关系数据库,应遵循 索引设计指南、 SQL Server 索引指南和 Azure Cosmos DB 索引指南。 使用 SQL 数据库对查询执行 自动优化 以提高其性能。
在 SQL 数据库中,应定期 重新组织或重新生成索引。 识别慢速查询并对其进行优化以提高性能。 许多数据库引擎具有查询优化功能。 有关详细信息,请参阅 查询性能的最佳做法。
Azure Cosmos DB 具有 默认索引策略 ,该策略为每个项的每个属性编制索引,并为任何字符串或数字强制实施范围索引。 此策略提供高效的查询性能,无需提前管理索引。
优化存储负载:许多 Azure 数据库服务支持只读副本。 只读副本的可用性和配置因 Azure 数据库服务而异。 请参阅每个服务的官方文档,了解详细信息和选项。
优化存储设计:Azure 提供许多不同的数据存储,以满足工作负荷需求。 了解数据存储类型 ,并为 应用程序选择 Azure 数据存储。
相关链接
- SQL 数据库中的自动优化
- Azure Cosmos DB
- Azure Cosmos DB 索引指南
- Azure SQL
- 查询性能的最佳做法
- CQRS 模式
- 数据分区指南
- 数据分区策略
- 默认索引策略
- 索引设计指南
- OLAP 概述
- OLTP 概述
- 分区最佳做法
- 重新组织或重新生成索引
- 为应用程序选择 Azure 数据存储
- SQL Server 索引指南
- 了解数据存储类型
性能效率清单
请参阅完整的建议集。