新手入行:如何提高数据库的性能?

scalablethread 2025-09-15 16:45:17

数据库扩展对于处理海量数据和高流量的系统至关重要。扩展之所以必要,主要有几个原因。首先,随着数据量和并发用户请求的增加,性能会下降。曾经快速的查询可能会变慢,从而导致糟糕的用户体验。其次,应用程序需要高可用性。

策略

可以采用多种技术(通常结合使用)来扩展数据库。

索引

索引通过创建指向行的指针来加快数据检索速度,这类似于书籍的索引。数据库无需扫描整个表(全表扫描)来查找特定行,而是可以使用索引快速定位数据。例如,假设有一个包含数百万行的orders 表。如果没有索引,通过order_id 搜索订单需要扫描每一行。在order_id 列上创建索引后,数据库几乎可以立即找到用户的记录。

权衡

索引可以加快读取查询(SELECT)的速度,但会减慢写入操作(INSERT, UPDATE, DELETE)的速度,因为写入时索引也必须更新。它们还会占用磁盘空间。应根据常见的查询模式谨慎选择索引。

物化视图

物化视图存储查询的预计算结果。对于频繁运行的涉及连接或聚合的复杂查询,计算一次结果并存储可以减少查询时间。例如,分析仪表板显示按产品类别聚合的每日总销售额。此查询涉及连接orders、order_items和products 表并执行聚合。创建一个存储这些每日总数的物化视图daily_sales_by_category,可以让仪表板通过查询这个简单视图来更快地加载。

权衡

物化视图中的数据可能会过时。它需要一种会消耗资源的刷新策略(例如,夜间刷新或由数据变化触发刷新)。物化视图还会占用存储空间。

反规范化

规范化是组织数据库表以减少数据冗余并提高数据完整性,通常涉及将数据拆分为多个相关表。非规范化是相反的过程:有意将冗余数据添加到一个或多个表中,以避免查询时代价高昂的连接。例如,电子商务应用程序必须经常显示产品名称和订单详细信息。规范化设计可能需要将订单表与产品表连接起来。为了加快速度,您可以通过直接向订单表添加product_name列来进行非规范化。这避免了读取期间的连接。

权衡

反规范化会增加存储需求。更重要的是,它会使数据更新变得复杂,并增加数据不一致的风险。如果产品名称发生更改,就必须在所有引用该名称的订单记录中进行更新,而不仅仅是在中心产品表中更新。

纵向扩展

这包括增加现有数据库服务器的资源,例如添加更多的CPU处理能力、内存或更快的磁盘存储(如固态硬盘)。

权衡

单台机器的扩展存在物理限制。高端硬件价格昂贵。它并不能显著提高容错能力,因为仍然存在单点故障。升级通常需要停机时间。

数据库缓存

缓存指的是在应用程序和数据库之间的临时、快速访问存储层(如Redis或Memcached)中存储频繁访问的数据。后续对相同数据的请求可以直接从缓存中获取,完全绕过数据库。例如,新闻网站会缓存热门文章。当用户请求一篇文章时,应用程序首先检查缓存。如果该文章已被缓存,就会立即返回。如果没有,应用程序会查询数据库,将文章返回给用户,并在缓存中存储一份副本,以备将来的请求使用。

权衡

缓存失效是一个复杂的问题。缓存增加了另一个需要管理的组件,并引入了潜在的一致性问题(过期数据)。它主要对读密集型工作负载有帮助。

复制

复制指的是创建主数据库服务器的一个或多个副本(复制品)。写入操作(INSERT, UPDATE, DELETE)在主服务器上进行。读取操作(SELECT)可分配到各个副本上执行。这有助于分散读取负载,提高读取吞吐量。复制还能提供高可用性:如果主服务器发生故障,可以将某个副本提升为新的主服务器。

权衡

主库上的更改在同步到从库之前,通常会存在复制延迟。这可能导致读取到略微过时的数据。它会增加基础设施成本和复杂性,且无法解决主服务器上高写入量带来的瓶颈问题。

分片

分片指的是将数据库数据水平分区到多个独立的数据库服务器(称为分片)上。每个分片包含总数据的一个子集。应用程序逻辑或代理层会根据分区键将查询路由到相应的分片。这样可以在多台机器上分配读写负载。

权衡

分片增加了应用程序开发和数据库操作的复杂性。需要从多个分片中获取数据的查询会变得复杂且缓慢。数据再平衡具有挑战性。选择合适的分片键对于避免数据分布不均至关重要。

何时考虑?

扩展会带来复杂性和成本,因此不应过早实施。尽早开始监控关键数据库指标。在实施复杂的扩展解决方案之前,务必先研究通过查询优化或架构改进是否能解决瓶颈问题。重写低效查询或添加适当的索引有时无需进行基础设施变更就能缓解问题。

原文:https://newsletter.scalablethread.com/p/how-to-improve-performance-of-your

快猫星云 联系方式 快猫星云 联系方式
快猫星云 联系方式
快猫星云 联系方式
快猫星云 联系方式
快猫星云
OpenSource
开源版
Flashcat
Flashcat