Mysql使用limit深度分页优化

Mysql使用limit深度分页优化,第1张

mysql使用select * limit offset, rows分页在深度分页的情况下。性能急剧下降。

limit用于数据的分页查询,当然也会用于数据的截取,下面是limit的用法:

1. 模仿百度、谷歌方案(前端业务控制)

类似于分段。我们给每次只能翻100页、超过一百页的需要重新加载后面的100页。这样就解决了每次加载数量数据大 速度慢的问题了

2. 记录每次取出的最大id, 然后where id >最大id

select * from table_name Where id >最大id limit 10000, 10

这种方法适用于:除了主键ID等离散型字段外,也适用连续型字段datetime等

最大id由前端分页pageNum和pageIndex计算出来。

3. IN获取id

4. join方式 + 覆盖索引(推荐)

如果对于有where 条件,又想走索引用limit的,必须设计一个索引,将where 放第一位,limit用到的主键放第2位,而且只能select 主键!

1. jdbcpagingReader使用方式

2. db索引分区器使用方式

入参1: 表名 如test_table

入参2: 排序索引字段 可以是主键,也可以是其他索引。需要保证是唯一索引即可。如:id

入参3: 主键可手动传入,也可以根据表名计算出来:现在只支持单列主键的。 如:id

入参4:具体表 要分多少块。如:4

SELECT * FROM table_name LIMIT [offset ,] rows

优化前:

原理:mysql会先查询出10000010(一千万零一十)条数据,然后丢弃前10000000(一千万)条数据,返回最后10(十)条数据,所以偏移量越大,性能就越差。

方法一、

使用 主键索引 进行关联查询

方法二、

每次记录当前页的 最后一条id ,作为下一页的查询条件

一、正常情况下没有人会翻到几千页,我们可以通过限制可以翻页的数量解决这个问题,如:百度、谷歌。

二、手机端可以使用下拉方式进行滚动翻页,每次记录当前页的最后一条id,作为下一页的查询条件。ES可以使用scroll API

用mysql本事的自增id来解决。处理tidb深度分页是用mysql本事的自增id来解决。深度分页其实就是搜索的深浅度,比如第1页,第2页,第10页,第20页,是比较浅的;第10000页,第20000页就是很深了。


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

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

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

发表评论

登录后才能评论

评论列表(0条)

保存