mysql延迟关联性能优化方法_MySQL延迟关联性能优化方法

当MySQL查询中同时使用ORDER BY和LIMIT且偏移量较大时,会导致性能下降。博客介绍了这个问题,并提出了优化策略,如限制翻页数量、反范式化、预先计算和缓存。还推荐使用延迟关联和覆盖索引来减少扫描行数,提高查询效率。优化查询可以避免随着偏移量增加而带来的性能瓶颈。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

【背景】

某业务数据库load 报警异常,出现较多的线上慢sql查询。定位问题之后,发现原因是:查询sql语句同时使用了ORDE BY 和 LIMIT,即使使用了索引,进行分页处理。因为随着偏移量的增加,MySQL需要花费大量的时间来扫描需要丢弃的数据。

下面这个查询就通过ORDE BY 和 LIMIT偏移量的组合翻页到很后面的时候:

mysql>SELECT FROM profiles WHERE sex=‘M‘ ORDER BY rating LIMIT 100000,10;

无论如何创建索引,这种查询都是个严重的问题。因为随着偏移量增加,MySQL需要花费大量的时间来扫描需要丢弃的数据。反范式化、预先计算和缓存可能是解决这类查询的仅有策略。一个更好的办法是限制用户能够翻页的数量,实际上这对用户的体验影响很大,因为用户很少真正在乎搜索结果的第10000页。

优化这类索引的另一个比较好的策略是使用延迟关联,通过使用覆盖索引查询返回需要的主键,再根据这类逐渐关联原来获取得需要的行。这就可以减少MySQL扫描那些需要丢弃的行数。下面这个查询显示了如何高效的使用(sex rating)索引进行排序和分页:

mysql> SELECT FROM profiles INNER JOIN(

-> SELECT FROM profiles

-> WHERE x.sex = ‘M‘ ORDER BY rating LIMIT 100000,10

-> ) AS x USING();

上面语句优化的结果:

mysql> SELECT FROM profiles INNER JOIN(

-> SELECT id FROM profiles

-> WHERE x.sex = ‘M‘ ORDER BY rating LIMIT 100000,10

-> ) AS x WHERE x.id = profiles.id;

原文:https://www.cnblogs.com/blackEyeProgram/p/12826433.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值