7种数据库性能扩展技术
有很多因素会影响数据库的性能。一些重要的因素如下:
- 数据项大小:数据库中存储的项目的平均有效负载大小决定了工作负载是受 CPU 限制还是受存储限制。
- 数据项类型:项目类型直接影响可能的压缩类型。例如,如果您存储的是文本,则可以利用高压缩率。但存储图像、视频或加密数据时,压缩率就没那么高了。
- 总数据集大小:这直接影响基础设施选项以及是否需要进行复制和分片。
- 吞吐量和延迟要求:仅仅说“高吞吐量”是不够的。了解目标吞吐量对于选择最佳数据库类型和基础架构至关重要。
1 - 索引
在数据库中,索引充当数据的“目录”。
它允许数据库快速定位和检索特定信息,而无需扫描每条记录。如果没有索引,数据库就必须扫描整个表才能找到匹配的记录。
例如,如果您有一个“客户”表,其中包含“ID”、“姓名”、“电子邮件”和“城市”等列。如果您经常通过电子邮件搜索客户,那么在“电子邮件”列上创建索引会产生很大的不同。
索引的主要好处是:
- 查询速度更快
- 减少资源使用
- 提高并发性
权衡如下:
- 每个索引列的额外磁盘空间
- 在写入操作期间需要做更多工作来更新索引。
2 – 物化视图
物化视图就像查询结果的快照,与原始数据分开存储。
它来自一个或多个表或视图,并独立维护。可以将其视为预先计算的摘要,您可以在需要时快速访问它。
物化视图可以定期刷新以保持数据最新。
物化视图的主要优点是:
- 无需在用户请求流中运行复杂且耗时的查询。
- 减轻负荷
权衡如下:
- 额外存储空间
- 刷新时间更长且视图中的数据不一致
3 - 非规范化
非规范化涉及在多个表中复制数据以优化查询性能。目标是减少检索数据所需的连接和计算次数,使查询更快、更具可扩展性。
换句话说,为了提高性能,规范化规则稍微放宽了一点。
想象一下,一家电子商务商店有一张“客户”表和一张“订单”表。在规范化设计中,“订单”表将仅存储对“客户”表的引用。
要获取带有订单信息的客户详细信息,您需要连接两个表。但是,随着订单数量的增长,连接操作可能会成为性能瓶颈。
这时非规范化就派上用场了。
通过将“CustomerName”之类的字段直接存储在“Orders”表中,您可以在单个查询中检索详细信息以及订单信息。请注意,这只是一个示例场景,这样做可能取决于整个系统环境和现有的数据建模规则。
非规范化的好处:
- 查询速度更快
- 减少开销
- 提高读取性能
权衡如下:
- 数据冗余。
- 复杂的更新,因为冗余数据可能需要在多个表之间保持同步。
- 潜在的不一致。
4 - 垂直扩展
垂直扩展,也称为“向上扩展”,是一种专注于增加单个服务器硬件资源的技术。
这一切都是为了让您的数据库服务器更大、更强、更快。
一些简单的方法是:
- 升级到更快的 CPU
- 为服务器添加更多内存
- 切换到 SSD 等高性能存储设备。
垂直扩展有几个好处:
- 更好的性能
- 简化管理
- 减少延迟
但是,也存在一些限制:
- 在达到某些成本限制之前,服务器的垂直扩展能力是有限制的。
- 单个服务器故障就可能导致您的数据库崩溃。
- 升级硬件可能会很昂贵。
5 - 缓存
缓存是一种将经常访问的数据存储在与主数据库分开的高速存储层中的技术。
当应用程序收到数据请求时,它首先检查缓存。如果找到数据(缓存命中),则快速检索数据,而无需打扰数据库。如果没有找到数据(缓存未命中),应用程序将从数据库中提取数据,并在缓存中存储副本以供将来的请求使用。
缓存的好处如下:
- 减少数据库负载
- 提高读取性能
但也存在一些权衡:
- 额外的复杂性
- 额外费用
- 数据过时的可能性
6 - 复制
复制是数据库系统中用来在不同的服务器或节点上创建和维护数据的多个副本的技术。
在典型的领导者-追随者复制模型中,一个节点被指定为领导者,而其他节点为追随者。
领导者处理所有写入操作,确保一致性和完整性。每当在领导者节点上执行写入操作时,更改都会自动与跟随节点共享。领导者还可以处理需要高度一致性的关键读取操作。
反过来,跟随节点处理读取操作并帮助分配工作负载以提高性能。
复制的好处如下:
- 提高读取性能
- 高可用性
- 耐用性
但也存在一些权衡:
- 引入一些数据同步延迟,称为复制滞后
- 复杂性增加
7 - 分片
数据库分片是一种将单个大型数据库划分为更小、更易于管理的单元(称为分片)的技术。
在分片数据库架构中,数据根据特定的分片键分布在多个分片上。分片键的选择决定了数据如何分配到不同的分片。
常见的分片策略包括:
- 基于范围的分片:根据分片键的值范围对数据进行分区。
- 基于哈希的分片:将哈希函数应用于分片键以确定目标分片。
- 基于目录的分片:维护一个单独的查找表,以将分片键映射到相应的分片。
Sharding 的好处如下:
- 分片允许数据库的水平扩展。
- 查询和写入操作并行处理。
- 与垂直扩展相比,降低了硬件成本。
然而,也存在一些弊端:
- 分片带来了额外的复杂性。
- 跨分片重新平衡数据可能是一个复杂且耗时的过程。
- 跨分片合并数据可能很有挑战性。