当前使用版本(必填,否则不予处理)

3.4.2

该问题是如何引起的?(确定最新版也有问题再提!!!)

mysql 表数据量达到 53万条时 limit 越查越慢

mybatis-plus 分页插件

重现步骤(如果有就写完整)

SELECT * FROM table LIMIT 529480,10

报错信息

无报错 查询时间长至 8秒

插件有封装解决这个问题吗?

Comment From: qmdx

你先定位查询是 COUNT 慢,还是 limit 分页慢, 再拿出来单独执行 SQL 看看是否慢,如果一样慢你需要考虑优化查询 Sql 添加索引等方式

Comment From: icandoithzx

深分页问题,看你表主键是否是自增id,可以通过id自增优化。如果id非自增,建议使用子查询优化

Comment From: HuBoZhi

@icandoithzx 你可以看一下这个问题嘛,你在使用子查询优化时是否遇到这种情况:https://github.com/baomidou/mybatis-plus/issues/4987

Comment From: xiguazhiPrince

这种和框架没问题,搜下深分页优化方式吧

Comment From: songsong001001

MySQL 并不是跳过 offset 行,而是取 offset+N 行,然后返回放弃前 offset 行,返回 N 行,那当 offset 特别大 的时候,效率就非常的低下,要么控制返回的总页数,要么对超过特定阈值的页数进行 SQL 改写。 先快速定位需要获取的 id 段,然后再关联: SELECT t1.* FROM 表 1 as t1 , (select id from 表 1 where 条件 LIMIT 100000 , 20) as t2 where t1.id = t2.id

Comment From: HuBoZhi

MySQL 并不是跳过 offset 行,而是取 offset+N 行,然后返回放弃前 offset 行,返回 N 行,那当 offset 特别大 的时候,效率就非常的低下,要么控制返回的总页数,要么对超过特定阈值的页数进行 SQL 改写。 先快速定位需要获取的 id 段,然后再关联: SELECT t1.* FROM 表 1 as t1 , (select id from 表 1 where 条件 LIMIT 100000 , 20) as t2 where t1.id = t2.id

感谢解答,我当时发起这个问题的时候以为MyBatis在查询数据的SQL中就能同时将总量给查询回来呢,后来将日志打开后才发现,MyBatisPlus发了两条SQL,一条用来查询数据,一条用来查询总数的。