limit与分页键

前言

查询数据库偏移量的数据,或者查询分页的数据是很常见的需求,本文会介绍一些常用的查询方法。

limit与分页

在SQL中,limit用于限制返回的结果行数。LIMIT语句可以用于SELECT查询,用于限制查询结果集的行数,从而在处理大型数据集时,减少数据库的负载,提高查询的性能

基本语法如下

sql 复制代码
SELECT * FROM table_name LIMIT [offset],row_count;
//table_name是表名
//offset是可选的偏移量,用于指定要从结构集的哪个位置开始返回行
如果省略该参数,默认从第一行开始返回
//row_count一共返回的行数,也就是查询得到的数量

比如
select * from students limit 5,10;

或者
select * from students limit 10 offset 5;

limit在实际应用中常用于分页查询

举个例子:

现在我有一个article表,想要做到文章分页展示的功能,每一页展示10篇文章

sql 复制代码
//表结构如下

CREATE TABLE article (
id int(11) not null auto_increment,
title varchar(255) not null,
content text,
publish_time datetime not null,
primary key (id)
);

/这个时候调用方传来一个n,通常是Logic层往dao层传 伪代码如下
select * from article order by
publish_time desc limit ?,10 values (n*10);

//这条SQL就能做到文章分页的功能,按照时间来分页
//具体实践中可能没有这么简单,通常是热度、时间等等

深分页

查询结果集中的某个位置之后的记录,即查询结果集的偏移量很大的情况。这样需要扫描的数据量就很大,可能导致查询的性能变得很低下

如何避免深分页的问题

  • 使用更小的偏移量:比如将偏移量从10000降低到100
  • 使用分页键
  • 缓存结果集,在内存层面进行返回
  • 分库分表,减少每个表的数据量大小

分页键

分页键(pagination key)是一种用于分页查询的技术,它可以帮助我们在大数据集合中快速定位到需要查询的数据段,也叫做游标(Cursor) 。分页键通常是一个唯一的标识符,可以表示查询结果集中的某一行。在使用分页键的时候,通过查询分页键来定位结果集的起始位置,从而避免了偏移量很大的情况,也就是避免了SQL深分页的情况。

举个例子,假设我们需要查询一个包含一百万行数据的用户表,并且我们需要查询第500001到第500100行的数据。如果用偏移量的方式进行查询,需要查询前5000000行数据才能获得我们需要的结果,这将导致查询性能非常低下。而使用分页键的方式,可以在查询时直接指定分页键的值,从而定位到结果集的起始位置,避免了大量的数据扫描。

使用分页键的时候,我们需要选择一个合适的字段作为分页键,并确保该字段具有唯一性。通常情况下,自增长主键或者时间戳字段都是比较好的选择,分页键适用于有序数据集的分页查询

下面有一个具体的栗子

假设我们有一个包含大量文章的表,每篇文章都有一个唯一编号id和发布时间publish_time两个字段。我们需要查询发布时间在2022年1月1日到2022年3月31日之间的文章,并按照发布时间进行排序,每页显示十篇文章,显示第六页的数据

sql 复制代码
1.选择分页键:根据查询条件,我们选择publish_time作为分页键

2.查询第五页的最后一篇文章的发布时间
我们得确定第五页最后一篇文章的发布时间
select publish from articles 
where publish_time>='2022-01-01 00:00:00'
and publish_time<='2022-03-31 23:59:59'
order by pulish_time asc 
limit 1 offset 50;

3.使用分页键查询数据
select * FROM articels 
where publish_time>='分页键的值'
and publish_time<='2022-03-31 23:59:59'
order by publish_time asc 
limit 10;

推荐阅读

当说到云原生时,我们究竟在谈论什么? - 掘金

不太熟悉Git? 不妨看看这篇文章 - 掘金

一文搞定常见分布式事务实现 - 掘金

你真的理解分布式理论吗? - 掘金

深入了解异地多活 - 掘金

02.K8S架构详解 - 掘金

01.你为什么需要学习K8S - 掘金

相关推荐
枕星而眠2 分钟前
C++ String类精讲:从基础用法到进阶底层原理
开发语言·c++·后端·学习方法
YOU OU2 分钟前
MyBatis 操作数据库(入门)
数据库·mybatis
念何架构之路7 分钟前
Go pprof性能剖析
开发语言·后端·golang
zhz52147 分钟前
Spring Boot 接入国密实战:传输加密(TLCP)+ 密码加密(SM4)
java·spring boot·后端·国密·sm4
电商API_1800790524715 分钟前
反向海淘是什么?现状如何?未来趋势如何?
数据库·人工智能·笔记·性能优化·数据挖掘·网络爬虫
MRSM_0115 分钟前
Redis 缓存、队列、排行榜的核心用法
数据库·redis·缓存
唐青枫15 分钟前
别让 NULL 拖垮结果:MySQL COALESCE 空值兜底实战详解
sql·mysql
我是一颗柠檬15 分钟前
【JDK8新特性】函数式接口Day2
java·开发语言·后端·intellij-idea
Trouvaille ~16 分钟前
【Redis篇】Redis 安装与启动:快速搭建一个 Redis 环境
数据库·redis·后端·ubuntu·缓存·环境搭建·安装教程
Mahir0818 分钟前
Spring Boot 自动装配深度解密:从原理到自定义 Starter 实战
java·spring boot·后端·自动装配·自定义starter·大厂面试题