Mysql 延迟关联

文章探讨了在MySQL中,当使用LIMIT进行大量偏移量分页时的性能问题。通过解释回表的过程和其带来的效率降低,提出了覆盖索引的概念以减少回表操作。进一步,文章介绍了延迟关联优化技术,如何通过先筛选出需要的ID再进行回表查询,显著降低了回表数据量,提高查询效率。
摘要由CSDN通过智能技术生成

优化数据库分页(limit):
在偏移量非常大的时候,例如 LIMIT 10000,20 这样的查询,这时MySQL需要查询10020条记录然后
只返回最后20条,前面的10000条记录都将被抛弃,这样的代价是非常高的。如果所有的页面被访问的
频率都相同,那么这样的查询平均需要访问半个表的数据。要优化这种查询,要么是在页面中限制分页
的数量,要么是优化大偏移量的性能。

回表的速度是很慢的(因为表中的数据存储在磁盘中,磁盘IO的速度很慢,现代计算机一次磁盘IO的时间大概为0.02s~0.04s)

覆盖索引:
select字段和where 字段在一颗索引上上全覆盖,不用回表,速度更快。


延迟关联、覆盖索引优化:
(假设city字段使用索引)

分析下面sql语句:

select id,name,work from table where city = "上海" order by salary limit 100000,20;

1、通过city索引树上找到全部值为“上海”的数据的id
2、取得id后回表,取得id,name,work,salary数据后将字段放入sort buffer进行排序(如果数据量过大则使用file sort)
3、对salary进行快速排序完成后,取出前100020 条数据后抛弃前100000条数据,按分页条件给用户返回20条记录。

这里的回表至少需要回表100000条数据。


使用延迟关联优化后

select id,name,work from table
inner join 
(select id from table where city="上海" order by salary limit 100000,20) using(id);

1、通过city索引树上找到全部值为“上海”的数据,通过覆盖索引取得id,salary字段
2、将取得的字段进行排序(sort buffer / file sort)
3、取出排序后的前100020条数据抛弃前100000条数据,按分页条件取20条记录id。
4、取得id后进行回表查询这20条记录,最后返回用户20条记录。

这里的回表只需要回表20条数据。


参考:
什么是MySQL的覆盖索引
mysql 链表排序_MySQL 排序的艺术:你真的懂 Order By 吗?
Mysql 延迟关联

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

辽宇

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值