MySQL大分页SQL的优化思路

延迟关联法,特别适用于倒排序和 LIMIT m,n 其中m很大的情况

所谓的延迟关联,就是先找出目标数据的主键id,通过主键id再去关联主表拿其他字段。

由于MySQL 8.0 之前都要不支持倒序索引,所以desc降序没办法通过索引排序,用延迟关联法效率要高很多。

LIMIT m,n 的原理是从第1条数据(包含了所有字段)开始,往后顺序找第m条,定位到m位置后,再往后找n条数据。随着m的增大,定位m位置所需花的成本就越大,耗时越多。
但如果通过主键id去定位,其他字段先不管,后面再通过目标数据的主键id去关联主表拿其他字段,效率要高很多。

当然也可以直接在程序中处理好m和n ,直接传值进来,这样SQL的效率更高,limit m,n等价于 >= m AND < m+n

下面是两个案例:

1、有问题的慢SQL

SELECT t1.*,t2.patient_json,t2.accept_time,t2.first_reply_time,t2.service_json,t2.cancel_type,t2.cancel_time,t2.cancel_remark,t2.is_anonymous
FROM qa_question t1, qa_question_ext t2
WHERE t1.id = t2.question_id
AND expert_id = 69
AND t1.status = 30
ORDER BY t1.over_time DESC
LIMIT 0, 10 ;

优化方法:延迟关联法
优化后的SQL:

SELECT t1.*,t2.patient_json,t2.accept_time,t2.first_reply_time,t2.service_json,t2.cancel_type,t2.cancel_time,t2.cancel_remark,t2.is_anonymous
FROM qa_question t1, qa_question_ext t2 , ( SELECT id FROM qa_question WHERE expert_id = 69 AND STATUS = 30 ORDER BY over_time DESC LIMIT 0, 10 ) c
WHERE t1.id = t2.question_id
  AND t1.id = c.id ;


2、有问题的慢SQL5

SELECT id,out_case_id,question_id,TYPE,uid,expert_id,sku,price,content,attachments_json,like_count,unlike_count,listened_num,listened_client_num,is_hidden,is_anonymous,
is_deleted,create_user_id,modify_user_id,create_time,modify_time
FROM qa_question_case
LIMIT 725100,100 ;

优化方法:延迟关联法
优化后的SQL:

SELECT a.id,out_case_id,question_id,TYPE,uid,expert_id,sku,price,content,attachments_json,like_count,unlike_count,listened_num,listened_client_num,is_hidden,is_anonymous,
is_deleted,create_user_id,modify_user_id,create_time,modify_time
FROM qa_question_case a ,( SELECT id FROM qa_question_case LIMIT 725100,100 ) r
WHERE a.id=r.id ;


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值