什么是limit 深分页问题?怎么解决?

这篇具有很好参考价值的文章主要介绍了什么是limit 深分页问题?怎么解决?。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

什么是limit 深分页问题?怎么解决?
select * from table order by key limit 10;
select * from table order by key limit 9999, 10;
我们想到给这个要排序的字段加上索引,但是加上索引之后,查询的速度依旧很慢。
当深分页的时候,优化器都不会选择走key这个辅助索引了,而是选择type = All,全表扫描,因为优化器这时候觉得,你走辅助索引,还要大量的回表,可能效率还不如直接全表扫描 + 排序呢。
为什么深分页慢呢?
因为深分页,会有很多不必要,没有意义的回表操作。我只要第9999页的记录,但是第 9998,9997…页的记录也都会进行回表操作。
从sql角度优化:
select * from table where key >=
(select key from table order by key limit 9999, 1)
// 利用索引覆盖特性查找第9999页的第一条记录,type = index,extra = using index
order by key limit 10;
// 走key的索引,快速定位,然后再往后取10条记录就行了,type = range,extra = using where
从业务角度优化:
连续翻页,可以利用上一页的最后一条记录的字段值,作为下一页的查询的起始值,可以减少一次子查询。
这时你就明白了,为什么有的地方UI只有上一页,下一页了吧。没有可以跳转的页数,给用户点击。
还有移动端的滚动加载,上拉加载下一页也是基于这个思路优化的。
还可以省去 count(*) 计算总页数的过程
select * from table where key >
上一页最后一条记录的字段值
order by key limit 10;
但是存在一个问题:还需要考虑出现大量重复数据的情况,在后续页的查询需要增加偏移量的处理
但是这样的设计真的有必要,有意义吗?用户真的会没事来查询第1万页的数据吗?
美年达大佬提供的调优方案:
先通过子查询拿到第99000页的所有记录的id值,然后和原表进行一次join表连接,比对id值,减少大量的回表操作。
select * from order_info as o
join (select id from order_info where period = 202207 order by modified desc limit 99000, 1000)
as temp on temp.id = o.id order by modified;文章来源地址https://www.toymoban.com/news/detail-458173.html

到了这里,关于什么是limit 深分页问题?怎么解决?的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Mysql——》优化limit分页

    推荐链接:     总结——》【Java】     总结——》【Mysql】     总结——》【Redis】     总结——》【Kafka】     总结——》【Spring】     总结——》【SpringBoot】     总结——》【MyBatis、MyBatis-Plus】     总结——》【Linux】     总结——》【MongoDB】    

    2024年02月13日
    浏览(41)
  • limit的使用——分页显示

    limit 的具体应用(非常重要经常使用)    1、limit作用:将查询结果集的一部分取出,通常使用在分页查询当中(比如:百度的查询结果分页显示,每页10条)分页的作用是为了提高用户的体验,因为一次全部查询出来,用户体验差。    2、limit的使用:                 完

    2024年02月02日
    浏览(26)
  • 自学网络安全遇到问题怎么解决?路线是什么

    自学网络安全很容易学着学着就迷茫了,找到源头问题,解决它就可以了,所以首先咱们聊聊,学习网络安全方向通常会有哪些问题,看到后面有惊喜哦 1、打基础时间太长 学基础花费很长时间,光语言都有几门,有些人会倒在学习 linux 系统及命令的路上,更多的人会倒在学

    2024年02月06日
    浏览(52)
  • Elasticsearch分页搜索数量不能超过10000的解决This limit can be set by changing the [index.max_result_window] index

    开发环境:  JDK1.8、Elasticsearch7.3.1、RestHighLevelClient 问题:  最近在通过Java客户端操作ES进行分页查询(from+size)时,分页获取满足条件的数据和总数。发现满足条件的数据总数一旦超过10000条,使用SearchResponse的getHits().getTotalHits().value返回的结果永远是10000。为什么会被限制只能搜

    2024年02月04日
    浏览(41)
  • hive limit分页查询、row_number()分页查询

       hive执行limit语句报错,分页失败 如: 2.1 row_number()的使用   (1)按照deptno分组,不排序   (2)按照empno进行排序,不分组,排序列命名rownum   (3)按照empno排序,同时根据deptno进行分组 2.2 分页   从原表中查询第6到第10行数据 注:   row_number最好写一个 临时

    2023年04月08日
    浏览(42)
  • Mybatis中limit用法与分页查询

    错误示范 错误示范一: 错误示范二: 这里先要了解一下: #{}和${}的区别: #{}表示一个占位符号,通过#{}可以实现preparedStatement向占位符中设置值,自动进行java类型和jdbc类型转换。#{}可以有效防止sql注入。 #{}可以接收简单类型值或pojo属性值。 如果parameterType传输单个简单类

    2024年02月15日
    浏览(43)
  • MySQL分页查询详解:优化大数据集的LIMIT和OFFSET

    最近在工作中,我们遇到了一个需求,甲方要求直接从数据库导出一个业务模块中所有使用中的工单信息。为了实现这一目标,我编写了一条SQL查询语句,并请求DBA协助导出数据。尽管工单数量并不多,只有3000多条,但每个工单都包含了大量的信息。DBA进行了多次导出操作,

    2024年02月10日
    浏览(52)
  • java.lang.OutOfMemoryError: GC overhead limit exceeded问题分析及解决

    出现该问题的原因:当GC为释放很小空间占用大量时间时会抛出此异常,即(Sun 官方对此的定义,超过98%的时间用来做GC并且回收了不到2%的堆内存时会抛出此异常)。一般是因为堆太小,导致异常的原因:没有足够的内存。 对于该项目我的启动命令如下:堆内存空间开辟的

    2024年01月21日
    浏览(52)
  • 玩转Mysql系列 - 第8篇:详解排序和分页(order by & limit),及存在的坑

    这是Mysql系列第7篇。 环境:mysql5.7.25,cmd命令中进行演示。 代码中被[]包含的表示可选,|符号分开的表示可选其一。 本章内容 详解排序查询 详解limit limit存在的坑 分页查询中的坑 排序查询(order by) 电商中:我们想查看今天所有成交的订单,按照交易额从高到低排序,此

    2024年02月11日
    浏览(47)
  • 解决Elasticsearch索引报错问题之Limit of total fields 1000 has been exceeded ...

    在Kibana上查询生产环境的日志时,发现某个一直无法查询到,怀疑想要的日志被丢弃了,遂登录服务器查询原始日志,果然发现日志存在被丢弃的问题。经定位,在Logstash的日志中发现问题所在: Elasticsearch的Mapping做了映射保护,为了防止索引中错误的内容导致Mapping

    2024年02月11日
    浏览(36)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包