针对 MySQL 多表关联查询与多次单表查询效率的问题,分析不同情况下的效率对比与原因。
在数据规模较小,如十几万行的情况下,假设 A 和 B 两张表均无索引,且关联操作为笛卡尔积,则关联结果量可能呈爆炸式增长,达到亿级别,导致网络 I/O 成为瓶颈。此时,一次性拉取十万行结果集的效率可能远高于一次性拉取亿级别结果集的效率。在实际业务中,通常会考虑关联条件和索引使用,使得关联操作主要针对一个较小的结果集进行。采用服务层(service)进行关联操作,可以减少 RPC 调用次数,通过先查询 A 表得到小结果集,再根据此结果集拼凑 B 表查询条件,进行第二次查询,最后在服务层进行合并。这相比直接在数据库中执行关联查询,能减少一次 RPC 调用。
在业务实践中,多将计算密集型操作移至服务层,以提高单机数据库的吞吐量。数据库作为事务处理的核心,计算资源昂贵,难以水平扩展。将计算操作放入服务层,利用服务层的计算资源,数据库则专注于数据存储和事务处理。这体现了业务优先,数据库轻量化的架构设计。
业务在发展过程中,可能会涉及多数据库部署,为满足复杂业务需求,常在多个数据库间增加中间件层,以实现跨数据库的关联操作。然而,数据库分库分表后,传统 join 操作受到限制,特别是当两个表位于不同物理库时。为保证数据一致性,服务层的合并操作成为更灵活、可行的方案。在分库分表场景下,同步更新不同物理库中的两个表时,服务层能够通过扫描 A 表失败记录并检查 B 表更新状态,实现数据合并,避免使用 join 操作。
本文如未解决您的问题请添加抖音号:51dongshi(抖音搜索懂视),直接咨询即可。