问题原因:
pageHelper会在查询语句的基础上增加一条语句:select COUNT(*) from xxx,这条语句引起的查询速度变慢。

解决前
我的表里只有两条数据都用了接近3s,这个延迟是完全不能忍受的。
在这里插入图片描述
解决后(我使用的方案一):

可以明显看到问题被解决掉了,查询时间从原来的接近3000ms到现在的144ms,完全正常。

在这里插入图片描述

方案一(简单,推荐,注意:MyISAM引擎不支持外键,且是表级锁,不支持行级锁等高并发手段,如果业务体量过百万,任然建议使用innoDB引擎)

修改表引擎为MyISAM
—在修改表引擎时,由于MyISAM引擎没有外键,所以要去掉所有其他表中引用这个表某列的外键。
在这方面应该做好取舍,如果想要级联删除或修改,建议编写sql代码完成,不建议在具体代码中维护级联的关系。
推荐使用可视化工具:sqlyog
在这里插入图片描述
使用mysql语句修改表引擎(注意清理外键,否则会报错):

ALTER TABLE 表名 ENGINE=MyISAM

也可使用可视化工具修改,来叭,展示(注意清理外键,否则会失败):
在这里插入图片描述
在这里插入图片描述
**

方案二(不推荐)

: 多建一个表:
建一个新表记录表的列数 ,响应原表的行的增加和删除从而记录行数,再通过重写pageHelper的 select COUNT() 方法来解决问题。

推荐两种方案都重写pagehelper的select COUNT()方法

如何重写pageHelper的select COUNT()方法
###这篇博客最后的参考文章里有xml版的重写方法,这里我只给出mapper接口的方法: 注意命名方式(在查询函数后面增加 _COUNT)和返回类型(必须为long),这样就覆盖了pagehelper的方法了。pagehelper会自动扫描,不需要进行其他的操作。
在这里插入图片描述


以下是参考原文内容以及链接:


原文链接:https://blog.csdn.net/xusen112/article/details/80887608
原文内容

方案1: 修改表引擎(最好能改)

直接修改表引擎,如果默认是InnoDB,由于该引擎不保存表的具体行数,在数据量上百万后统计基本在1秒以上;

修改为MyISAM;但是分页查询的时候同样是在100万以后的记录查会非常慢;

方案2: 多建一个表用触发器维护

尝试使用插件的自定义count语句,但是能找到的只有select max(id) 这样的,查询数量是模糊结果,不精确

,方法是在原select语句下增加这一块 _COUNT 是固定后缀 getAllUser是查询语句id

   <select id="getAllUser_COUNT" resultType="Long">

  select max(id) from users
   </select>;

误差比较大,所以最后采用触发器维护另外一个表;

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐