说一下数据库查询 和 分页问题的解决

时间:2020-12-22 04:36:02

# 当分页的页码越大时,数据加载的速度就会越慢

 - 为什么呢?

 解: 因为数据库每次查询要访问页码中的数据的时候,都是从 0 开始扫描的 ,怎么说呢 

 比如: 你要访问 第 10000 页的数据,数据库是如何做的呢 , 它会先扫描前 9999 页的数据,然后再将第 10000 页的数据返回给你, 想想看啊,如果你要访问 第 一百万页,甚至一千万页 的数据,那这个速度可想而知

    But,解决方案肯定是有的,在这里说几个

  1. 最简单的方法就是限制你显示页页数 , 比如,你就只给用户展示 100 页的数据,页码就到100,多余的不展示,因为也没有多少个用户想看 后面 第几万,第几百万条的数据吧,基本*问网页都只是看最新的前几页的数据,所以只需要展示部分数据就行了

  2. 上面的解决方案是最常用的,但是,但是啊,我现在就是用户,我就是想访问 第 100 万条数据呢,你该怎么办?

这个时候不要急,肯定是有解决方案的, 你看啊, 我可以加一个筛选条件 (伪代码) 'where id >100万 limit 10' 来让数据库进行查询,这样做之后,数据库就会根据索引 id 一下子跑到第 100万条然后再取出后 10 条数据了, 是不是速度飞快,但是你觉得这样是不是就解决了呢 , 不不不, 还没完,如果我在数据库进行过一次删除,就在前100条数据删除了两条,此次删除会发生什么问题呢,如果我要看 前110条的数据,那么这次拿到的数据还是前110条的数据吗? 虽然自身索引id没变,但是 索引已经不连续了, 如果 还是用(伪代码) 'id > 100 limit 10' 来取的话,拿到的数据就不对了, 这该怎么办呢 ?? 

当然解决方案还是有的, 你可以记录当前页 的第一条数据和最后一条数据,也就是当前页的最小索引 id 和 最大索引 id, 比如当前是 第5页(每页10条数据) 我要往后翻一页的话,只需要拿到当前页的最大索引 id 去数据库中直接跳到这个id 位置再往后拿 10 条就行了,如果往前翻页的话,就只需要拿着 当前页的最小索引id 去数据库中跳到 id 位置再往前拿 10 条数据就行了

到此 才算告一段落..