分享人:田文瑞
1.背景介绍
2.知识剖析
3.常见问题
4.解决方案
5.编码实战
6.扩展思考
7.参考文献
8.更多讨论
9.鸣谢
场景:
当线上研发代码编写不规范,使用mybatis编写sql语句时使用万能匹配查询语句:where 1 = 1 之后,如果拼接的if条件都不符合条件,就会出现sql语句查全表的情况,在这种情况下就会导致数据过多,塞满内存,不断GC(垃圾收集),导致整个服务宕掉。
解决办法:
第一种:使用分页查询,引用Limit,限制查询出的数据条数 服务器性能、资源:如果数据量过大时,使用分页查询后,可以避免一次查询全表数据过多,硬生生把内存塞满,不断GC,整个服务宕掉的情况。 用户体验:分页查询可以使页面显示更加美观整洁。
物理分页依赖的是某一物理实体,这个物理实体就是数据库,比如MySQL数据库提供了limit关键字,程序员只需要编写带有limit关键字的SQL语句,数据库返回的就是分页结果。
逻辑分页依赖的是程序员编写的代码。数据库返回的不是分页结果,而是全部数据,然后再由程序员通过代码获取分页数据,常用的操作是一次性从数据库中查询出全部数据并存储到List集合中,因为List集合有序,再根据索引获取指定范围的数据。
limit的语法select * from table where ... limit start,size;
start:从第几条记录开始。
size : 读取几条记录。
首先需要知道,从第几条[下标]开始读,要往后读取多少条。
即分页显示的话,需要传给sql语句两个参数,某一页面中第一条在表中的下标,以及页面中数据的条数。
size:默认指定一个,或者从前台输入后取一个。
start下标:前端传过来要跳转到的页码,后台sql中加入(pageNum-1)*size的计算,即为对应页面的start下标值。
另一种方式是一种方式是,前端js计算完,直接传值过来。不涉及sql语句的计算。
1、limit分页实现需要哪些参数?
2、前端怎么传过来要跳转的页码?传过来后后端如何接收?
3、ssm框架实现分页还有哪种方式
1、limit分页实现需要哪些参数?
select * from table where ... limit start,size;size:每页显示多少条 (pageRows)
start:每页的起始行号(beginRownum)每页的起始行号(beginRownum) = 当前页数(pageNum - 1)* 每页条数(pageRows)
beginRownum = (pageNum - 1) * pageRows;
1、limit分页实现需要哪些参数?
select * from table where ... limit start,size;总条数(totalRows)/每页条数(pageRows)=总页数(totalPages)有无余数 url中传值负数跳页面
totalPages = totalRows % pageRows == 0 ? totalRows / pageRows : (totalRows / pageRows) + 1
PageHelp分页插件
1、分段 每次只能翻100页,超过一百页的需要重新加载后面的100页,解决每次加载数据量过大,速度慢
2、子查询优化 记录每次取出的最大id :Select * From test Where ID>=(Select ID From test limit 90000,1)limit 100 比较 Select * From test limit 90000,1
3、做索引
.......
感谢观看,如有出错,恳请指正