mysql 延迟关联

延迟关联:为什么叫延迟关联?延迟两个字的关键在于延迟了对列的访问

延迟关联的原理是借助了覆盖索引

覆盖索引怎么理解?覆盖两个字的关键在于所需要的值是从索引中获取而非读取表中数据,因此叫覆盖。本人认为覆盖两个字,还有上边的延迟两个字,很精确形象。

延迟关联应用场景:

①select * from 表 A where 条件; (select * 中的*也可以是很多列,如a,b,c,d,e……)

假如表中数据有2000行,而经过where条件过滤后,符合的数据有50行,那么上边的sql写法存在对不需要的行中的数据先取出然后由于不符合where条件,所以最终舍弃。这里的关键点在于:提前取出了不需要数据行中的列。

这个问题如何解决?

改写sql为如下形式:

②select * from 表 A join (select B.id form 表 B where 条件)on 表A.id = 表B.id; (表A和表B为同一张表的不同别名)

这里的关键在于:通过使用覆盖索引先获取需要的键(一般为主键),再根据取到的键关联原表获得需要的行,这可以减少MYSQL扫描那些不符合条件的行。

但不是所有如sql①的写法改写为sql②后会提升性能,应用不对反而会下降,具体问题需要具体分析。

大概可以分三种情况:

总数据为4万行,符合条件的为3万行。改写后提升不是特别明显;

总数据为4万行,符合条件的为300行。改写后性能提升很明显;

总数据为50行,符合条件的为40行,改写后反而性能下降。

此外,一般分页时,如limit n,m,当n特别大时,通常需要用延迟关联来解决性能问题。

 

 

 

 

 

  • 5
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值