首页 > 其他分享 >大量数据如何做分页处理

大量数据如何做分页处理

时间:2024-04-10 09:34:20浏览次数:15  
标签:10000 分页 处理 外键 查询 大量 数据 id

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

简介

大批量数据的展示一直被视为一个必须要解决的问题。 一个经典的思想就是分批展示和处理它们。

1 查询时外键的处理

如果在django model 中模型使用了外键,通过on_delete 来定义关联操作。

CASCADE: 级联操作。如果外键那条数据删除了,这条数据也将被删除
PROTECT: 受保护,只要这条数据引用了外键的那条数据,旧不能删除外键数据,如果强行删除,Django框架将报错
SET_NULL: 设置为空,如果外键数据被删除,本条数据设置为空,前提是 可以设置本条数据为空
SET_DEFAULT: 设置默认值,如果外键数据删除了,设置这个数据的值为默认,前提是有默认值
SET()函数: 如果外键那条数据被删除,那么将会获取SET函数的值作为外键的值。Set()函数可以接受可调用对象,可调用对象的返回值作为结果设置回去。
DO_NOTHING: 不采取任何行为,一切看数据库级别的行为。

数据库层面的约束:

    PESTRICT: 默认选项,如果要删除父表记录,如果子表有关联记录,则不允许删除
    NOACTION:同上,首先检测外键
    CASCADE: 父表delete,update时,子表关联操作 也进行 delete,update
    SET NULL:父表delete , update时,子表将关联记录外键字段设置为null,所以设计子表时不能 not null

这些外键的方法工具,可以帮助使用者处理多表关联查询任务。

1.1 如何在django中查询分页

在有分页查询的应用中,包括 LIMIT 和 OFFSET 的查询十分常见,而且几乎每个都会有一个 ORDER BY 子句。

如果使用索引排序的话将对性能优化十分有帮助,否则服务端需要做很多文件排序。

一个高频的问题是 offset 的值过大。如果查询类似 LIMIT 10000, 20,将会产生10020行,并将之前的10000行丢弃,这样的代价很高。

    select * from table order by id limit 10000, 20;

很简单,该语句的意思就是查询10000+20条记录,去掉前10000条,返回后20条。
无疑该查询能够实现分页,但10000这位置的值越大,查询性能就越低,因为MySQL需要扫描全部10000+20条记录。

假设所有的页使用相同的频次访问,这样的查询将平均扫描一半数据表。为了优化他们,你可以在分页视图中限制最多可访问的页数,或者让大批量的查询更有效。

当一个表中有很多符合查询条件的数据的时候,我们往往不需要把他们全部一次性取出来,那样对查询效率或者服务器性能来说都会是一个极大的挑战:例如最简单的商城,假设商城中有一万个数据,但我们在前端可能只会每次看到一页.

    select * from table where xxx="xxx" limit 10; 

这表示查询符合条件的10个数据。

    select * from table where xxx="xxx" limit 10 offset 10;

这表示分页,查询符合条件的第11到20的数据。

或者通过指定最大id去查询

    select * from table where id > #max_id# order by id limit n;

该查询同样会返回后n条记录,却无需像方式1扫描前m条记录,但必须在每次查询时拿到上一次查询(上一页)的最大id(或最小id),是比较常用的方式。

当然该查询的问题也在于,如果最大id不是连续的,则我们不一定能拿到这个id,比如当前在第3页,需要查询第5页的数据,就不行了。

或者通过子查询,先筛选前10000个,找到最大id,然后选择剩余的20个符合要求的

    select * from table where id > (select id from table order by id limit m, 1) limit n;

该查询同样是通过子查询扫描字段id, 因为它不需要进行表的关联,而是一个简单的比较,在不知道上一页最大id的情况下,是比较推荐的用法。

左右连接的方式本身性能可能更差。
还有如下子查询、连接表,加索引快速定位元组,然后再读取元组

    SELECT * FROM table WHERE id <= (SELECT id FROM table ORDER BY id DESC LIMIT (page-1)*pagesize ORDER BY id DESC LIMIT pagesize)

rest_framework 内建了分页的操作模块,让我们来应用到具体函数即可 employee/views.py

from rest_framework.pagination import PageNumberPagination
@api_view(['GET', 'POST']) 
@permission_classes([CustomPermission])
def blog_api_view(request):
    """"""
    if request.method == "GET":
        paginator = PageNumberPagination()
        # paginator.page_size = 1 setting we display only 1 item per page.
        paginator.page_size = 2
        task_objects = EmployeeSign.objects.all()
        result = paginator.paginate_queryset(task_objects, request)

如果不使用分页,将显示全部的消息在同一个页面

        serializer = TaskSerializer(result, many=True)
        return Response(serializer.data)

访问分页数据.默认接口http://127.0.0.1:2001/api/tasks/ 就是分页1

http://127.0.0.1:2001/api/tasks/?page=1  #2,3,4...

2 小结

再重复一次,在有分页查询的应用中,包括 LIMIT 和 OFFSET 的查询十分常见,而且几乎每个都会有一个 ORDER BY 子句。如果使用索引排序的话将对性能优化十分有帮助,否则服务端需要做很多文件排序。

一个高频的问题是 offset 的值过大。如果查询类似 LIMIT 10000, 20,将会产生10020行,并将之前的10000行丢弃,这样的代价很高。

假设所有的页使用相同的频次访问,这样的查询将平均扫描一半数据表。

为了优化他们,你可以在分页视图中限制最多可访问的页数,或者让大量的查询更有效。

 

点击关注,第一时间了解华为云新鲜技术~

 

标签:10000,分页,处理,外键,查询,大量,数据,id
From: https://www.cnblogs.com/huaweiyun/p/18125350

相关文章

  • 【SpringBoot + Tomcat】【二】请求到达后端服务进程后的处理过程-连接的处理细节
    1 前言上节的后半部分,由于忙项目的事情去了,收尾的有点潦草,我们这节再继续。上节我们的思路是先简单回顾了下,SpringBoot启动和创建Tomcat的时机,然后我们还主要看了下连接器Connector的创建已经启动过程。连接器本身很重要,因为它就像一个港口或者一个枢纽,连接着客户端和服......
  • CMD 批处理脚本自定义 UEFI 启动项,您需要使用 bcdedit 命令来操作 Windows 引导管理器
    CMD批处理脚本自定义UEFI启动项,您需要使用bcdedit命令来操作Windows引导管理器(BootConfigurationData,BCD)。BCD存储了计算机启动时所需的信息,包括可用的操作系统和启动选项。以下是一个简单的示例,演示如何使用CMD批处理脚本添加、修改和删除启动项:1.添加启动项要添......
  • Windows 系统 端口被占用怎么处理?
    在Windows系统中如果端口被占用了,可通过以下步骤处理:1、打开命令终端使用快捷键Windonws+R,输入cmd调出命令窗口2、查找端口占用情况在命令终端中输入netstat-ano|findstr"端口号"查看端口的占用情况,找到端口号对应的进程PIDnetstat-ano|findstr"端口号......
  • 使用阿里云试用Elasticsearch学习:3.7 处理人类语言——拼写错误
    我们期望在类似时间和价格的结构化数据上执行一个查询来返回精确匹配的文档。然而,好的全文检索不应该是完全相同的限定逻辑。相反,我们可以扩大范围以包括可能的匹配,而根据相关性得分将更好的匹配推到结果集的顶部。事实上,只能完全匹配的全文搜索可能会困扰你的用户。......
  • 6.文本处理
    【一】深浅拷贝1)浅拷贝复制对象的一层内容,若包含可变数据,则拷贝对象与原对象共享这些可变数据类型的引用即原对象中的可变数据类型进行修改操作时,拷贝的对象也会受到影响。importcopy#原对象count=[1,[3,4]]#浅拷贝count_1=copy.copy(count)count.append(2......
  • 运用预训练 Keras 模型来处理图像分类请求,学习如何使用从 Keras 创建 SavedModel
    前置import'''importosimporttempfilefrommatplotlibimportpyplotaspltimportnumpyasnpimporttensorflowastftmpdir=tempfile.mkdtemp()'''介绍如何用keras检测自己找的图片'''file=tf.keras.utils.get_file(&quo......
  • ETL工具-nifi干货系列 第十讲 处理器RouteOnAttribute(数据流路由)
    1、今天我们一起来学习下处理器RouteOnAttribute,此处理器的作用是根据属性值进行路由进而来控制数据流的走向。类似于java中的if-else或者switch-case。如下图所示。 GenerateFlowFile产生测试数据,{"name":"Javax小金刚","id":"2"}JoltTransformJSON转换json结构:{"person":......
  • 操作系统综合题之“采用二级页表的分页存储管理方式,计算页目录号的位数 和 页的大小,给
    一、问题:某计算机系统的主存按字节编址,逻辑地址和物理地址都是32位,其内存管理采用练级页表的分页存储管理方式。逻辑地址中页号为10位,页内偏移地址为12位。该计算机系统的两级页表结构如下图所示,图中数值均为十进制数1.页目录号的位数为多少?页的大小为多少KB?2.如果页目录项大小......
  • Spring Security——13,认证成功&&失败&&注销成功处理器
    认证成功&&失败&&注销成功处理器说明:一、认证成功处理器1.1自定义成功处理器1.2配置自定义成功处理器二、认证失败处理器2.1自定义失败处理器2.2配置自定义失败处理器三、登出成功处理器3.1自定义登出处理器3.2配置登出处理器四、完结撒花一键三连有没有捏~~......
  • c# Framwork4.5 添加webapi处理跨域请求问题
     常用2种方式 1)web.config允许所有来源,HTTP方法,请求标头跨域:后端,在Web.config中找到<system.webServer>标签,里面添加配置如下:<httpProtocol><customHeaders><addname="Access-Control-Allow-Origin"value="*"/><addname="Acc......