问题原因:
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>;
误差比较大,所以最后采用触发器维护另外一个表;