慎用Mybatis分页插件PageHelper!

大多数人跟我一样,最开始接触PageHelper的时候,都被超级方便的分页操作吸引

有多方便?

public PageInfo querySharePage(QueryObject qo) {
        PageHelper.startPage(qo.getCurrentPage(), qo.getPageSize());
        List<ShareTrainHh> shareList = trainHhMapper.selectAll();
        return new PageInfo(shareList);
}

一个普通的分页功能,从头到尾只需要三句代码

但是!

数据量大一点的表,千万不要随便拿来就用!

举例:

1. MySql的order by和limit一起使用时的BUG

select * from table_a where user_id = xx order by gmt_create desc limit xx

这样的话,即使user_id加了索引,但还是会非常非常慢,关于这个问题的细节自行百度。
这个问题能不能解决?可以。而且不难

select * from
(
  select * from table_a where user_id = xx order by gmt_create desc
) a
limit xx

像这样在外层套一个查询,把order by和limit分开就可以解决。
但是!
因为插件是自己在sql后面拼的limit,我们没办法控制,所以此问题无解。

2. 数据量过大时 limit分页效率

当数据量大到一定量级后,比如有几个text字段的大表100万条数据的时候
这个时候执行sql

select * from table_a limit 800000,10

只查了10条数据,但是非常非常慢!
因为根据limit的执行原理,这里是查出前80W+10条数据,然后截掉前面的80W条数据。
这个问题能不能解决?也可以。

select * from trable_a 
where id in
(
  select id from trable_a limit 800000,10
) a

像这样先利用主键索引确定id的范围,再去查询具体数据就可以。
但是!
因为插件是自己在sql后面拼的limit,我们没办法控制,所以此问题无解。

以上。在很可能需要优化的业务里,千万不能用PageHelper插件,以及其他的分页插件,自己写的分页更好拓展!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 转 # https://www.cnblogs.com/easypass/archive/2010/12/ 08/...
    吕品㗊阅读 9,824评论 0 44
  • MYSQL 基础知识 1 MySQL数据库概要 2 简单MySQL环境 3 数据的存储和获取 4 MySQL基本操...
    Kingtester阅读 7,857评论 5 116
  • 在实际的项目开发中,常常需要使用到分页,分页方式分为两种:前端分页和后端分页。 前端分页一次ajax请求数据的所有...
    意识流丶阅读 70,442评论 2 70
  • 今天看到一位朋友写的mysql笔记总结,觉得写的很详细很用心,这里转载一下,供大家参考下,也希望大家能关注他原文地...
    信仰与初衷阅读 4,761评论 0 30
  • 1、简洁明了是说话的第一要义 最近楼市火爆,几乎每天都能接到各个地产楼盘销售人员的电话。 情景一、 “喂,你...
    戎马未央阅读 227评论 0 1