首页技术文章正文

Paginator进行大数据集分页:如何提升性能?

更新时间:2020-08-03 来源:黑马程序员 浏览量:

学过Django框架的同学,一定都使用过Django框架的Paginator分页功能,今天我们要讨论的是关于使用Paginator进行大数据集分页时,它性能的优化问题。

Paginator分页

下面步入正题,首先我们来看一个Django中使用Paginator进行分页的例子:

1)首先我创建了一个Django项目并定义了一个User用户模型类

Django海量数据分页优化01


2)执行迁移在数据库中生成tb_users用户表并添加800万个测试用户数据

Django海量数据集分页优化02

3)编写使用Paginator类进行分页的测试代码,并测试获取相应页的数据

Django海量数据集分页优化03

4)分页测试代码执行完成之后,我们来看终端输出的内容

Django海量数据集分页优化04

5)对于上面的分页测试结果,我们再来看一下mysql的日志记录数据

Django海量数据集分页优化05

注:mysql的日志文件在/var/log/mysql/mysql.log,测试之前可以先使用tail -f /var/log/mysql/mysql.log打开这个文件,测试之后就可以看到对应输出的日志信息

6)看完上面的内容之后,接下来我们就可以看Django框架关于Paginator类分页的官网文档了

Django海量数据集分页优化06

上面红色框框里的提示就是告诉我们,在使用Paginator对大数据量的QuerySet进行分页时,如果请求页码较大的某页数据时,查询效率可能会很慢,因为Limit/Offset分页时,先要根据Offset偏移量从前向后扫描数据。

PS:看到这里,是不是感觉到了官网文档的重要性,很多问题在官网文档上都有对应的说明,下面附上这个文档的链接:https://docs.djangoproject.com/zh-hans/2.2/topics/pagination/

分页问题解决

好,说了这么多,最后的问题要来了,怎么解决这个问题呢?下面咱们来说一个很多大厂使用的解决方案,什么方案呢,会不会很高大上呢?

其实很简单,就是限制用户请求的最大页数,比如只允许用户访问前100页的数据,如果请求的页码超过100页,可以默认返回第1页的数据,这样就不会有上面的问题,是不是很简单呢。这个思想也很简单,大家平时搜索内容或购买商品时,是不是只会浏览前几页的内容呢?不用我回答,你应该已经有了答案

小知识:百度搜索内容显示时,只允许用户访问前76页的内容;淘宝搜索上面商品显示时,只允许用户访问前100页的内容。

最后,怎么知道这个解决方案的?其实还是在文档,大家请看。

Django海量数据集分页优化07


附上文档链接:https://code.djangoproject.com/ticket/14131,建议大家平时自己多看文档,授人以鱼不如授人以渔,假以时日,这就是你的渔。

好啦,关于大数据集分页的问题,咱们今天就说到这,有没有其它方案呢?大家可以多去探索。


猜你喜欢:

“栈”是什么?如何实现一个“栈”?

Python编程加入日志的方法

黑马程序员Python培训课程

分享到:
在线咨询 我要报名
和我们在线交谈!