首页 > 试题广场 >

介绍一下数据库分页

[问答题]
推荐

得分点

​ 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)
 数据库分页是将数据库中的数据根据需求进行分页的一种方式。其优势如下:
逻辑分页依赖于代码,效率低。
物理分页依赖于数据库,效率高。
逻辑分页是半自动化的分页步骤,物理分页是手写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)