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