mysql 分页 - 游标 和 偏移量

    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、时间戳等单一字段进行排序。在涉及多个检索条件的情况下,游标分页的实现会比较复杂,并且可能导致性能下降。

posted @ 2024-04-22 16:01  艳阳老院  阅读(161)  评论(0编辑  收藏  举报