如何处理实际业务中需要很多张表的关联查询

背景

这是一个在实际业务中遇到的问题,一个车联网业务中,当前的页面需要对车辆违章的数据进行记录,在公司业务中,这个页面需要返回违章的基础数据、行程的数据,申请车辆出行的数据、车辆的基础数据、车辆车牌的数据、司机的数据信息等等。这些数据大概有10多个字段需要返回给前端,但是这些数据在数据库中分布得很散,我最开始使用了left join的方法进行关联,最后发现返回所有的数据需要关联大概7、8个表。

问题

  • 多表关联查询的复杂性

    • 需要返回的数据散布在多个表中,使用 LEFT JOIN 进行关联查询导致查询语句复杂,编码和维护难度大。这种复杂的查询结构不仅影响代码的可读性和维护性,还可能影响数据库的查询性能。
  • 数据库查询效率问题

    • 多表关联查询会增加数据库的负载和响应时间,特别是在数据量大或者缺乏适当索引的情况下,可能导致查询效率低下。

解决思路

1.添加冗余字段

在某些情况下,为了优化查询性能和简化查询逻辑,可以考虑在需要频繁访问的数据表中添加冗余字段。例如,如果某些字段在多个查询中频繁使用,可以将这些字段冗余存储到需要返回的目标表中。这样可以减少 JOIN 操作的次数和复杂度。

2.将负责查询改成多个简单查询

将复杂的多表关联查询拆分成多个简单的查询。这种方法可以降低单个查询的复杂度,提高代码的可读性和维护性。在应用程序层面,可以使用事务来确保数据的一致性和完整性。

设计查询的时候一个需要考虑的重要问题是是否需要将一个复杂的查询分成多个简单。的查询。在传统实现中,总是强调需要数据库层完成尽可能多的工作,这样做的逻辑在于以前总是认为网络通信、查询解析和优化是一件代价很高的事情。但是这样的想法对于MySQL并不适用,MYSQL从设计上让连接和断开连接都很轻量级,在返回一个小的查询结果方面很高效。现代的网络速度比以前要快很多,无论是带宽还是延迟。在某些版本的MySQL上,即使在一个通用服务器上,也能够运行每秒超过10万的查询,即使是一个千兆网卡也能轻松满足每秒超过2000次的查询。所以运行多个小查询现在已经不是大问题了。很多高性能的应用都会对关联查询进行分解。这样子的好处:

  • 让缓存的效率更高。许多应用程序可以方便地缓存单表查询对应的结果对象,如果关联中的某个表发生了变化,那么就无法使用查询缓存了,而拆分后,如果某个表很少改变,那么基于该表的查询就可以重复利用查询缓存结果了。
  • 将查询分解后,执行单个查询可以减少锁的竞争。

3..添加索引

  实在没有办法或者改不了数据库的情况,可以通过添加索引减少一点损失,在执行连接操作(如 JOIN 操作)时,数据库需要匹配连接条件,并将符合条件的行组合起来。如果没有适当的索引,数据库引擎可能需要执行全表扫描,即遍历每一行来查找符合连接条件的数据,这样的操作成本非常高昂,尤其是在大型数据集上。这种情况可以将关联的字段进行索引的添加,假设在 table2 表中,table1_id 字段是与 table1 表中的主键或唯一键相关联的外键。如果你在 table2 表上创建了一个联合索引 (table1_id, table2.column2),这个索引会按照 table1_id 字段的值排序,并且在每个 table1_id 值下按照 column2 字段的值排序。当执行类似于 SELECT ... FROM table1 LEFT JOIN table2 ON table1.id = table2.table1_id WHERE ... 的查询时,数据库引擎可以利用 table1_id 字段上的索引快速定位符合连接条件的行。因为索引已经将相同 table1_id 值的行聚集在一起,数据库可以更有效地执行连接操作,而不需要对整个表进行全表扫描。

  • 11
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值