当前使用版本(必填,否则不予处理)
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,一条用来查询数据,一条用来查询总数的。