mysql大量数据分页查询优化-延迟关联

举报
仙士可 发表于 2023/06/14 11:41:15 2023/06/14
【摘要】 所有的php初学者都应该知道,mysql的分页语句写法如下:select * from a limit (page-1)*page_size,page_size复制而当这语句分页到一定程度时,例如1000页,每页20条select * from a limit 19980,20复制会发现分页之后查询的会越来越慢原因是因为limit a,b 的取数据方式是,先取出a+b条数据,再把a条筛选掉,...

所有的php初学者都应该知道,mysql的分页语句写法如下:

select * from a limit (page-1)*page_size,page_size
复制

而当这语句分页到一定程度时,例如1000页,每页20条

select * from a limit 19980,20
复制

会发现分页之后查询的会越来越慢

原因是因为limit a,b 的取数据方式是,先取出a+b条数据,再把a条筛选掉,剩b条,相当于一次性要取a+b条的数据,而a条其实是无用的

解决方案如下

一:php代码解决

例如我们先查询出第一页的数据:

select * from a limit 20
复制

保留最后一个的id,当需要取第2页数据时,则

select * from a where id>最后一个的id limit 20
复制

这样数据库就会每次都能走索引,然后只查出20条

缺点:不能从第一页跳转到第n页

缺点解决方案:前100页,不做优化,当到101页时采用该优化方案,并且不让用户从101页进行页面跳转到1xx页

二:mysql解决

SELECT *
        FROM a
        inner join( 
        select id 
        from a
        LIMIT 19980, 20 
    ) as lim using(id);
复制

使用该方法,会先从索引表取出索引id,然后进行using索引覆盖方法,因为先查询的是索引,然后才从索引里关联取出20条记录,大大的提升了查询速度

实例图:

普通方法查询,0.123秒

上一页最后一个的id为20000,则

 php方法查询,0.070秒

mysql索引覆盖查询,0.089秒

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。