首页 > 数据库 >mysql 分页 - 游标 和 偏移量

mysql 分页 - 游标 和 偏移量

时间:2024-04-22 16:13:31浏览次数:24  
标签:分页 游标 偏移量 查询 cursor mysql name

    1. 游标是什么?作用是什么?

        游标,又称数据库指针。主要用于在结果集中移动到某一数据行的数据结构,类似于编程语言迭代器的概念,代表某一行的指针。

    2. mysql 游标的特性和语法。

       定义: DECLARE cursor_name  CURSOR  FOR  select_statement

       OPEN cursor_name
       FETCH  cursor_name INTO var_name [,var_name ] ...

       CLOSE cursor_name

       注意点: 游标必须声明在处理程序之前,并且在声明变量之后。

      5.7 游标 特性:

               ① 敏感 :游标的结果集是否对数据库中更改敏感,如果敏感,数据库基础数据发生变化时,游标的结果集也会相应的变化。敏感游标指向实际数据,不敏感游标指向数据副本。是否敏感取决配置:cursor_type: SENSITIVE、INSENSITIVE

               ② 只读 :游标的结果集是只读的,不能被更新。不能通过游标来修改基础表的数据。

               ③ 非滚动 :游标只能按照一个方向遍历结果集,并且不能跳过行。

    3. 偏移量是什么? 作用是什么?

        limit 子句用来约束 select 语句的返回行数,limit 接收 一个或两个参数。分别是 offset 和 row_countoffset  表示指定要返回第一行的偏移量。

        当使用偏移量进行分页时,数据库引擎首先会扫描并跳过指定偏移量数量的记录,然后返回所需的行数。随着偏移量的增加,数据库引擎需要在每次查询中跳过更多的记录,导致了查询速度变慢。

   4. 游标 和 偏移量 用法的优劣?

       对于偏移量:

              优势:使用偏移量分页实现相对简单,还可以实现跳页查询访问。

              劣势:

                        ①,基于偏移量分页,在数据量很大时,查询效率会比较低。反观 where 查询则可以使用 b+树索引 去进行筛选,O(logn) > > O(n)

                        ②,在并发场景下会出现数据重复。例如 offset 在第二页时,有人在第一页插入数据或者删除数据。

                        ③,显式的 Page 参数,在支持跳页的同时,也会被爬虫并发请求。这是因为爬虫可以通过增加 page 参数值,就可以顺序的获取下一页数据,而不需要维护任何状态或位置信息。

       对于游标分页:

               优势:

                        ①,性能好。另外 使用where 条件进行分页时,每次查询都要扫描整个数据集以匹配 where 条件。

                        ②,并发安全。使用游标进行分页操作时,通常会记录当前查询的位置或状态,这个位置或状态在不同的查询之间是独立的,因此在多个并发查询中,每个查询都可以有自己独立的游标状态,不会相互影响。

                        ③,不会被无脑批量爬取。使用游标进行分页查询时,通常是通过在查询中记录上一次查询结果的位置或状态,然后根据这个位置或状态来获取下一页的数据,这种方式增加爬虫的复杂度。

               劣势:

                        ①,实现相较于偏移量较复杂。

                        ②,不支持跳页。

                        ③,不合适多检索条件的场景。游标分页适用于基于某一单一排序字段的连续分页,例如按照 ID、时间戳等单一字段进行排序。在涉及多个检索条件的情况下,游标分页的实现会比较复杂,并且可能导致性能下降。

标签:分页,游标,偏移量,查询,cursor,mysql,name
From: https://www.cnblogs.com/yanyanglaoyuan/p/18150783

相关文章

  • mysql 清除重复数据
    python代码defclean_table(db:Session):select_sql=('SELECTMIN(id)asid,col1,col2,COUNT(*)FROMtable''GROUPBYcol1,col2''HAVINGCOUNT(*)>1LIMIT200')whileTrue:......
  • mysql添加数据报错
    1452-Cannotaddorupdateachildrow:aforeignkeyconstraintfails('db_student_manager_web'.'s_student',CONSTRAINT'student_clazz_id_foreign'FOREIGNKEY('clazz_id)REFERENCES's_clazz'('id')......
  • MySQL精选60道面试题 ( 含答案 )
    2024的4月招聘季如此卷,没点真本事真技术,没点面试经验,不了解点职场套路,如何过五关斩六将?找工作最重要的一步自然是面试,马上跳槽季,网上出现了各种面试题,一时会让人眼花缭乱,分不清最该看哪个。虽然不提倡背答案,但是该看的面试题还是得看,这里给大家总结了一些MySQL的通用面试题,不管......
  • MySQL如何使用字符集配置选项
    MySQL中与character_set有关的配置选项有8个,分别是:mysql>showvariableslike'character_set%';+--------------------------+-------------------------------------+|Variable_name      |Value               |+------......
  • [数据库] 排查MySQL锁表情况及解决思路 [转]
    0序1排查方法:查看当前锁表事务由于出现的是锁表的问题,所以第一步从数据库入手,查看导致锁表的SQL语句是什么;查看是否锁表SQL语句;SELECT*FROMINFORMATION_SCHEMA.INNODB_LOCKS;该命令的输出结果包含了当前事务等待的锁资源的相关信息,包括事务ID、锁的类型、锁的模式、被......
  • docker安装mysql
    下载最新的官方镜像dockerpullmysql:latest启动mysqldockerrun-d-p3306:3306\--privileged=true\-v/app/mysql/log:/var/log/mysql\-v/app/mysql/data:/var/lib/mysql\-v/app/mysql/conf:/etc/mysql/conf.d\......
  • mysql
    Mysql的基本架构是什么样的?MySQL大致可以分为server层和存储引擎层两部分Server层包括连接器、查询缓存、分析器、优化器、执行器等,所有跨存储引擎的功能都在这一层实现,比如存储过程、触发器、视图等。存储引擎层负责数据存储和提取,支持InnoDB、MyISAM、Memory等多个存储引......
  • MYSQL explain的使用
     #1.table:表名#查询的每一行记录都对应着一个单表EXPLAINSELECT*FROMs1;#s1:驱动表s2:被驱动表EXPLAINSELECT*FROMs1INNERJOINs2;#2.id:在一个大的查询语句中每个SELECT关键字都对应一个唯一的idSELECT*FROMs1WHEREkey1='a';SELECT*FROMs1INNER......
  • [MYSQL] MYSQL ERROR CODE 错误编号合集
    1[MYSQL]MYSQLERRORCODE错误编号合集错误码错误解释备注说明错误:1236SQLSTATE:HY000(ER_MASTER_FATAL_ERROR_READING_BINLOG)消息:从二进制日志读取数据时,获得来自主服务器的致命错误%d:’%s’。错误:1237SQLSTATE:HY000(ER_SLAVE_IGNORED_TABLE)消息:......
  • MySQL-06.索引的数据结构
    1.为什么使用索引索引是存储引擎用于快速找到数据记录的一种数据结构,就好比一本书的目录部分,通过目录中找到对应文章的页码,便可快速定位到需要的文章。MySQL中的索引也是一样的道理,进行数据查找时,首先查看查询条件是否命中某条索引,符合则通过索引查找相关数据,如果不符合则需要全......