在平时的写代码过程 ,分页其实是一种很常见的机制,包括一些报表、网站的翻页以及一些视频的下拉都用到了分页功能,那么你是否思考过这些分页到底是怎么分的呢
提到mysql的分页,我觉得大部分程序员都不陌生,通过limit x,y进行数据的分页,那么这种分页是逻辑是什么呢,以及这种分页到底是算物理分页还是逻辑分页呢?
select * from table limit 10
像上面这句sql就是查询了从第0条数据开始,共计10条数据
又比如说
select * from table limit 10,10
这条sql就是查询了第10条开始的10条数据,也就是第10-20条
这种在数据库里进行分页的统一称为物理分页,物理分页通常依赖于某一物理实体,不仅是mysql,其他各种数据库也提供了不同的分页语句,通过在数据库中进行分页
与之相对的就是逻辑分页,怎么理解呢,这更像是我们一次性把所有数据全部查询出来,然后通过其他东西(代码)进行分页,例如一次性查询出了一个List,然后再慢慢分割,分割给前端需要的数据
这两种分页怎么说呢,
前者(物理分页):虽然会频繁访问数据库,但是与之相对的是每次查询都能保证获取到最新的结果,而且占据的内存也较小,你一次取10条数据出来和一次性取1w条数据那肯定完全不是同一个概念,我们一直使用到mybatis也是最常用的使用物理分页的方式每次limit一部分数据,当然也可以在mybatis中使用手动sql拼接limit,不过平时为了方便,一般都是采用PageHelper插件或者IPage进行分页
还有就是后者(逻辑分页):利用RowBounds进行逻辑分页,这种方式虽然降低了数据库的访问,但是相对的会大量使用内存,占据大量的内存空间,增加了服务器的负担,而且会损失一部分的实时性,不过这种方式也有优点,那就是适用于在数据量小并且增删改不频繁的场合
那如果我们平常使用物理分页的时候有什么注意点呢,考虑到limit在数据量小的时候其实是不怎么影响查询效率的,但是在数据量比较大的时候 那么我们在limit x的时候会存在一个较大的偏移量,而这么大的一个偏移量会影响到查询语句的效率,那么就需要使用索引才能减少这一偏移量,索引提前存放了将数据库表中的数据以一定的方式排序并存储在内存或磁盘上。在查询操作时,数据库系统会利用索引快速定位到所需数据,避免了全表扫描的情况,从而提高了查询效率,
-- 大概意思就是这样
SELECT * FROM table WHERE id > 10000 LIMIT 10
这样limit就不用从0开始偏移了,可以直接从一个大概的范围开始偏移从而让性能基本稳定,受偏移量和行数的影响不大