MySQL分页查询LIMIT

MySQL分页查询LIMIT,第1张

SELECT * FROM table LIMIT [offset,] rows

offset :偏移,从 offset 条之后开始选择数据,如果 offset 不填,则 offset 为0。

rows :从偏移后开始,选择 rows 条数据。

特点:左开右闭,即选取 (offset,offset+rows] 的数据。

SELECT * FROM table LIMIT 5

SELECT * FROM table LIMIT 0,5

区间:(0,5]

offset=0

rows=5-0=5

SELECT * FROM table LIMIT 2,4

区间:(1,5]

offset=1

rows=5-1=4

SELECT * FROM table LIMIT n,m

区间:(n-1,m]

offset=n-1

rows=m-n+1

准备数据是20000000条数据

分页场景下,使用limit start end,我们分别看下从10000, 100000, 1000000开始分页的执行时间(每页取10条),如下图

当start较小时,查询没有性能问题,但是如上图查询时间所示,随着start增大,查询消耗时间也在递增,在start=10000000时,分页竟然消耗了2秒多,这是不能忍受的。

由此引出对limit分页的优化,首先来explain该语句,看到查询没有使用到任何的索引,进行的是全表扫描,假如limit分页用到了索引是不是会快很多呢!

explain分析一下,第一行是select * from user_innodb形成的临时表使用的是全表扫描,第二行是 (SELECT id FROM user_innodb LIMIT 10000000, 10)形成的,使用的是eq_ref,第三行是全表扫描a和bjoin形成的派生表,使用到的是index,所以速度也会快很多

当业务上按照月份分表,但是前端h5需要分页展示,小伙伴们不知有没有遇到这个这个需求最后怎么完成的。

我这里想了一个解决思路,可能还不完善,希望能抛转引玉。

1、入参pageNo 为页号码,如果为1那么就是第一页。pageSize 可以是入参也可定死,这里定死10条。Limit 是数据偏移标记,根据入参pageNo 计算出来的,Limit=(pageNo-1)*pageSize。假设A表有41条数据符合,B表有51条数据符合,如下图。

有几种种情况   1.如果limit<A表41条 那么需要从A表中取数据,(1)如果Limit+pageSize<Count直接获取数据即可(2)如果Limit+pageSize>Count,那么需要从A 表取部分数据从B表取一部分数据。

1.如果limit>A表41条  那么需要从B表取数据,如果B数据依然不足,那么重复以上的步骤。如下图


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/6126402.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-03-15
下一篇 2023-03-15

发表评论

登录后才能评论

评论列表(0条)

保存