首页 > 试题广场 >

介绍一下数据库分页

[问答题]
介绍一下数据库分页 
推荐

得分点

​ LIMIT

参考答案

标准回答

​ 不同的数据库实现分页的方式是不同的,下面我们以MySQL为例来说明如何分页。在MySQL中,分页是通过LIMIT子句实现的,LIMIT的语法如下。总之,带有一个值的LIMIT总是从第一行开始,返回指定的行数。带两个值的LIMIT可以从指定行号处开始,返回指定的行数。

-- 返回前10行记录
SELECT * FROM t LIMIT 10;
-- 从第21行开始返回10行记录
SELECT * FROM t LIMIT 21,10;

加分回答

​ 在偏移量非常大的时候,例如 LIMIT 10000,20 这样的查询,这时MySQL需要查询10020条记录然后只返回最后20条,前面的10000条记录都将被抛弃,这样的代价是非常高的。要优化这种查询,要么是在页面中限制分页的数量,要么是优化大偏移量的性能。

​ 优化此类分页查询的一个最简单的办法就是尽可能地使用索引覆盖扫描,而不是查询所有的列,然后根据需要做一次关联操作再返回所需的列。对于偏移量很大的时候,这样做的效率会提升非常大。考虑下面的查询:

SELECT film_id,description FROM sakila.film ORDER BY title LIMIT 50,5;

​ 如果这个表非常大,那么这个查询最好改写成下面的样子:

SELECT film.film_id,film.description 
FROM sakila.film
INNER JOIN (
    SELECT film_id FROM sakila.film ORDER BY title LIMIT 50,5
) AS lim USING(film_id);

​ 这里的“延迟关联”将大大提升查询效率,它让MySQL扫描尽可能少的页面,获取需要访问的记录后再根据关联列回原表查询需要的所有列。这个技术也可以用于优化关联查询中的LIMIT子句。

​ 有时候也可以将LIMIT查询转换为已知位置的查询,让MySQL通过范围扫描获得对应的结果。例如,如果在一个位置列上有索引,并且预先计算出了边界值,上面的查询就可以改写为:

SELECT film_id,description FROM skila.film
WHERE position BETWEEN 50 AND 54 ORDER BY position;

​ 对数据进行排名的问题也与此类似,但往往还会同时和GROUP BY混合使用,在这种情况下通常都需要预先计算并存储排名信息。

​ LIMIT和OFFSET的问题,其实是OFFSET的问题,它会导致MySQL扫描大量不需要的行然后再抛弃掉。如果可以使用书签记录上次取数的位置,那么下次就可以直接从该书签记录的位置开始扫描,这样就可以避免使用OFFSET。例如,若需要按照租赁记录做翻页,那么可以根据最新一条租赁记录向后追溯,这种做法可行是因为租赁记录的主键是单调增长的。首先使用下面的查询获得第一组结果:

SELECT * FROM sakila.rental ORDER BY rental_id DESC LIMIT 20;

​ 假设上面的查询返回的是主键16049到16030的租赁记录,那么下一页查询就可以从16030这个点开始:

SELECT * FROM sakila.rental 
WHERE rental_id < 16030 ORDER BY rental_id DESC LIMIT 20;

​ 该技术的好处是无论翻页到多么后面,其性能都会很好。

答案出处

​ 《高性能MySQL:第三版》,特卡琴科,6.7

编辑于 2021-09-17 11:42:45 回复(0)
select * from user limit 0, 10;
所谓分页,就是利用limit将数据一次查询的数量进行限制,相当于给小说分章节,如果不用limit加以限制,这段代码会一次性把user表中的数据一次性全部输出,使用了limit后,就可以根据参数对数据库的查询加以优化。第一个参数是指数据从哪里开始读,也就是表数据的下标:offset,而第二个数据指的是一页有多少个数据:pagenum,这里的代码就是把user表中的前十个数据全部拿出来,那第二页从哪里开始呢?代码如下:
select * from user limit 10, 10;
offset = (pagenum - 1) * pagesize;
这里的pagenum指的是第几页。
发表于 2022-04-02 21:10:08 回复(0)

分页一般是用limit做查询条数限制,我们在真正开发的时候一般表会建立主键并且主键是自增长的,所以我们在分页的时候使用主键id做查询条件,每一页查询到后将当页最大的id作为下一次查询条件,这样我们可以很好使用索引来加速查询

发表于 2024-06-06 16:51:16 回复(0)

数据库分页主要是为了解决一次性查询大量数据可能导致的性能问题和资源消耗过大。它的目的是将查询结果分成较小的、易于管理和显示的数据块(页),按需提供给用户。

常用的数据库分页方法主要有两种:

  1. 基于偏移量 (OFFSET) 和限制数量 (LIMIT):

    • 这是最常见和直观的方法。
    • 通过指定从结果集的开头跳过多少条记录(OFFSET),然后取出多少条记录(LIMIT)。
    • SQL 语法通常是 SELECT * FROM table_name LIMIT count OFFSET start;SELECT * FROM table_name LIMIT start, count;
    • 特点: 实现简单。但在数据量非常大、页数靠后的情况下,OFFSET 操作可能导致性能问题,因为它仍然需要扫描并跳过前面的大量记录。
  2. 基于游标 (Cursor) 或上次查询的标记:

    • 通常使用上一页最后一条记录的某个唯一或有序字段(如 ID、时间戳)作为下一页查询的起点。
    • SQL 语法类似 SELECT * FROM table_name WHERE id > last_id ORDER BY id LIMIT count;
    • 特点: 在处理大数据集时性能通常优于 OFFSET/LIMIT,因为它避免了对前面大量数据的扫描。更适合“下一页”/“上一页”的导航,但不适合直接跳转到任意页码。

作为前端,我们在调用后端接口时,通常会传递页码 (page) 和每页大小 (pageSize),后端再根据这些参数去数据库执行分页查询,并将当前页的数据返回给我们。了解后端的分页机制有助于我们更好地与后端协作和理解接口性能。

发表于 2025-05-17 17:50:11 回复(0)
 数据库分页是将数据库中的数据根据需求进行分页的一种方式。其优势如下:
逻辑分页依赖于代码,效率低。
物理分页依赖于数据库,效率高。
逻辑分页是半自动化的分页步骤,物理分页是手写SQL语句实现的分页。
数据库分页是将一个大数据集合(通常是一张表)分割成多个小集合,以便用户可以方便地浏览和处理数据。
基于应用程序的分页是通过在应用程序中处理数据来实现的。

发表于 2023-09-17 19:32:18 回复(0)

由于数据量过大,如果不加入分页的话就会一次性将所有数据取出来,非常耗费时间,而使用分页就可以很好地解决这个问题

mysql是通过limit来进行分页控制的

select * from (表) limit 0,10;

limit第一个参数就是从哪里开始读,第二个参数是一次读几页

当数据量小时通过limit实现分页查询,当数据量大时就会通过索引或建立主键来进行更快捷的查询。

发表于 2022-09-25 13:40:28 回复(0)
limit m n 
在数据量比较小的时候可以使用limit来实现分页查询
在数据量较大的时候 可以通过唯一索引或者建立主键来实现
发表于 2022-09-16 11:15:22 回复(0)
因为数据量过大,如果一次查询会好用大量时间以及性能,因此对数据进行分页显示变得尤为
重要。
不同的数据库实现分页的方式是不同的,下面我们以Mysql为例来说明如何分页。在Mysql中,
分页是通过Limit字句实现的,LIMIT的语法如下。总之带一个值的LIMIT总是从第一行开始,
返回指定的行数,带两个值的LIMIT可以从指定行号出开始,返回指定的行数。
/*返回前十行记录:
SELECT *FROM t LIMIT 10;
/*从第21行开始返回10条记录;
SELECT * FROM t LIMIT 21,10;
发表于 2022-09-08 21:15:39 回复(0)
1
发表于 2022-02-04 10:03:50 回复(0)
太有意思了,求Python的模拟面试,或者针对某个常用的软件、流行开源项目的面试。
求大神们来拯救我这个渣渣...
发表于 2021-10-12 17:27:47 回复(1)