大量数据如何做分页处理

打印 上一主题 下一主题

主题 696|帖子 696|积分 2088

本文分享自华为云社区《应用中大量数据的分页处理》,作者:码乐。
简介

大批量数据的展示不停被视为一个必须要办理的问题。 一个经典的头脑就是分批展示和处理它们。
1 查询时外键的处理

如果在django model 中模型使用了外键,通过on_delete 来界说关联操作。
  1. CASCADE: 级联操作。如果外键那条数据删除了,这条数据也将被删除
  2. PROTECT: 受保护,只要这条数据引用了外键的那条数据,旧不能删除外键数据,如果强行删除,Django框架将报错
  3. SET_NULL: 设置为空,如果外键数据被删除,本条数据设置为空,前提是 可以设置本条数据为空
  4. SET_DEFAULT: 设置默认值,如果外键数据删除了,设置这个数据的值为默认,前提是有默认值
  5. SET()函数: 如果外键那条数据被删除,那么将会获取SET函数的值作为外键的值。Set()函数可以接受可调用对象,可调用对象的返回值作为结果设置回去。
  6. DO_NOTHING: 不采取任何行为,一切看数据库级别的行为。
复制代码
数据库层面的约束:
  1.     PESTRICT: 默认选项,如果要删除父表记录,如果子表有关联记录,则不允许删除
  2.     NOACTION:同上,首先检测外键
  3.     CASCADE: 父表delete,update时,子表关联操作 也进行 delete,update
  4.     SET NULL:父表delete , update时,子表将关联记录外键字段设置为null,所以设计子表时不能 not null
复制代码
这些外键的方法工具,可以资助使用者处理多表关联查询使命。
1.1 如何在django中查询分页

在有分页查询的应用中,包括 LIMIT 和 OFFSET 的查询十分常见,而且几乎每个都会有一个 ORDER BY 子句。
如果使用索引排序的话将对性能优化十分有资助,否则服务端需要做很多文件排序。
一个高频的问题是 offset 的值过大。如果查询类似 LIMIT 10000, 20,将会产生10020行,并将之前的10000行丢弃,这样的代价很高。
  1.     select * from table order by id limit 10000, 20;
复制代码
很简朴,该语句的意思就是查询10000+20条记录,去掉前10000条,返回后20条。
无疑该查询能够实现分页,但10000这位置的值越大,查询性能就越低,因为MySQL需要扫描全部10000+20条记录。
假设所有的页使用相同的频次访问,这样的查询将平均扫描一半数据表。为了优化他们,你可以在分页视图中限制最多可访问的页数,大概让大批量的查询更有效。
当一个表中有很多符合查询条件的数据的时候,我们往往不需要把他们全部一次性取出来,那样对查询服从大概服务器性能来说都会是一个极大的挑衅:比方最简朴的商城,假设商城中有一万个数据,但我们在前端大概只会每次看到一页.
  1.     select * from table where xxx="xxx" limit 10;
复制代码
这表现查询符合条件的10个数据。
  1.     select * from table where xxx="xxx" limit 10 offset 10;
复制代码
这表现分页,查询符合条件的第11到20的数据。
大概通过指定最大id去查询
  1.     select * from table where id > #max_id# order by id limit n;
复制代码
该查询同样会返回后n条记录,却无需像方式1扫描前m条记录,但必须在每次查询时拿到上一次查询(上一页)的最大id(或最小id),是比力常用的方式。
当然该查询的问题也在于,如果最大id不是一连的,则我们不一定能拿到这个id,好比当前在第3页,需要查询第5页的数据,就不可了。
大概通过子查询,先筛选前10000个,找到最大id,然后选择剩余的20个符合要求的
  1.     select * from table where id > (select id from table order by id limit m, 1) limit n;
复制代码
该查询同样是通过子查询扫描字段id, 因为它不需要进行表的关联,而是一个简朴的比力,在不知道上一页最大id的情况下,是比力推荐的用法。
左右毗连的方式本身性能大概更差。
还有如下子查询、毗连表,加索引快速定位元组,然后再读取元组
[code]    SELECT * FROM table WHERE id
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

傲渊山岳

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表