前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >mysql大量数据分页查询优化-延迟关联

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

作者头像
仙士可
发布2019-12-18 15:19:15
2.5K0
发布2019-12-18 15:19:15
举报
文章被收录于专栏:仙士可博客仙士可博客

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

代码语言:javascript
复制
select * from a limit (page-1)*page_size,page_size

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

代码语言:javascript
复制
select * from a limit 19980,20

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

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

解决方案如下

一:php代码解决

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

代码语言:javascript
复制
select * from a limit 20

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

代码语言:javascript
复制
select * from a where id>最后一个的id limit 20

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

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

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

二:mysql解决

代码语言:javascript
复制
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秒

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2018-02-22 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
云数据库 SQL Server
腾讯云数据库 SQL Server (TencentDB for SQL Server)是业界最常用的商用数据库之一,对基于 Windows 架构的应用程序具有完美的支持。TencentDB for SQL Server 拥有微软正版授权,可持续为用户提供最新的功能,避免未授权使用软件的风险。具有即开即用、稳定可靠、安全运行、弹性扩缩等特点。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档