更新时间:2020年08月03日14时55分 来源:传智播客 浏览次数:
学过Django框架的同学,一定都使用过Django框架的Paginator分页功能,今天我们要讨论的是关于使用Paginator进行大数据集分页时,它性能的优化问题。
Paginator分页
下面步入正题,首先我们来看一个Django中使用Paginator进行分页的例子:
1)首先我创建了一个Django项目并定义了一个User用户模型类
2)执行迁移在数据库中生成tb_users用户表并添加800万个测试用户数据
3)编写使用Paginator类进行分页的测试代码,并测试获取相应页的数据
4)分页测试代码执行完成之后,我们来看终端输出的内容
5)对于上面的分页测试结果,我们再来看一下mysql的日志记录数据
注:mysql的日志文件在/var/log/mysql/mysql.log,测试之前可以先使用tail -f /var/log/mysql/mysql.log打开这个文件,测试之后就可以看到对应输出的日志信息
6)看完上面的内容之后,接下来我们就可以看Django框架关于Paginator类分页的官网文档了
上面红色框框里的提示就是告诉我们,在使用Paginator对大数据量的QuerySet进行分页时,如果请求页码较大的某页数据时,查询效率可能会很慢,因为Limit/Offset分页时,先要根据Offset偏移量从前向后扫描数据。
PS:看到这里,是不是感觉到了官网文档的重要性,很多问题在官网文档上都有对应的说明,下面附上这个文档的链接:https://docs.djangoproject.com/zh-hans/2.2/topics/pagination/
分页问题解决
好,说了这么多,最后的问题要来了,怎么解决这个问题呢?下面咱们来说一个很多大厂使用的解决方案,什么方案呢,会不会很高大上呢?
其实很简单,就是限制用户请求的最大页数,比如只允许用户访问前100页的数据,如果请求的页码超过100页,可以默认返回第1页的数据,这样就不会有上面的问题,是不是很简单呢。这个思想也很简单,大家平时搜索内容或购买商品时,是不是只会浏览前几页的内容呢?不用我回答,你应该已经有了答案
小知识:百度搜索内容显示时,只允许用户访问前76页的内容;淘宝搜索上面商品显示时,只允许用户访问前100页的内容。
最后,怎么知道这个解决方案的?其实还是在文档,大家请看。
附上文档链接:https://code.djangoproject.com/ticket/14131,建议大家平时自己多看文档,授人以鱼不如授人以渔,假以时日,这就是你的渔
好啦,关于大数据集分页的问题,咱们今天就说到这,有没有其它方案呢?大家可以多去探索。
猜你喜欢: