Mysql多表联查,查询结果出现重复的原因和解决方法

1 背景
根据业务需要,需要使用如下的命令进行多表联查

select a.id as a_id, b.id as b_id, b.protocol as protocol, b.priority as priority
 from (a, b) left join c on (a.network_id = c.network_id) where (a.id = b.acl_id 
 and c.network_id = 'dec4f9c4-f562-451d-8edf-fce4284b7fa1')

结果如下
在这里插入图片描述

发现结果很多重复项
2 解决方法
当时直接想到的是加DISTINCT进行去重,效果确实能够达到且立竿见影,除此之外,也可以在语句末尾添加group by b_id来实现同样的效果。
但是不能只知其然,后来发现,是自己join的c表没有关联主键或者说是value唯一性的字段。
通过对该表以该字段查询后发现确实存在两行数据,换言之,如果在c表中查询该字段对应的数据后
即SELECT * FROM c WHERE c.network_id = ‘123456789’;
结果显示数据有n行,那么根据笛卡尔积,left join 将会产生m * n条数据,会重复n倍。

3 总结
使用多表联查时尽量关联到主键上或者具有唯一约束的字段上,或者可以习惯性的加上DISTINCT来进行查询结果的去重

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
多表联查查询变慢时,可以通过建立索引来优化查询性能。下面是一些可以考虑的索引建立方法: 1. 单表索引:对于参与联查的每个表,检查单表查询是否需要索引来优化性能。通常,可以在经常用于过滤、排序和连接的列上建立索引。 2. 联合索引:如果多个列经常同时用于联查条件,可以考虑创建联合索引。联合索引可以覆盖多个列,提高查询效率。但要注意不要过度使用联合索引,因为索引的维护也需要耗费资源。 3. 联接列索引:对于经常用于联接的列,可以创建索引以加快联查操作的速度。 4. 覆盖索引:如果查询只需要返回部分列的结果,可以使用覆盖索引来避免访问表的数据行。覆盖索引只包含查询所需的列,可以减少磁盘IO和内存开销。 5. 优化查询语句:有时候,通过优化查询语句的结构和逻辑,可以减少对索引的需求,从而提高查询性能。例如,避免使用不必要的子查询、避免使用全表扫描等。 在进行索引优化时,需要注意以下几点: - 不要过度索引:过多的索引会增加写入操作的开销,降低写入性能。 - 统计信息更新:及时更新表的统计信息,以帮助优化器生成更好的查询计划。 - 注意索引列的数据类型和长度:选择合适的数据类型和长度,以减少索引的大小和内存开销。 - 定期检查索引的使用情况:检查慢查询日志或使用`EXPLAIN`语句来分析查询计划,判断索引是否被正确使用。 需要根据具体的查询场景和数据特点来进行索引优化,可以使用MySQL的`EXPLAIN`语句来分析查询计划,了解查询的执行情况,进而进行调整和优化。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值