关于go:limit与分页键

35次阅读

共计 1757 个字符,预计需要花费 5 分钟才能阅读完成。

博客:cbb777.fun

全平台账号: 安妮的心动录

github: https://github.com/anneheartrecord

下文中我说的可能对,也可能不对,鉴于笔者程度无限,请君自辨。有问题欢送大家找我探讨~

limit 与分页

在 SQL 中,limit 用于限度返回的后果行数。LIMIT 语句能够用于 SELECT 查问,用于 限度查问后果集的行数,从而在解决大型数据集时,缩小数据库的负载,进步查问的性能

根本语法如下

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 篇文章

// 表构造如下

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) 是一种用于分页查问的技术,它能够帮忙咱们在大数据汇合中疾速定位到须要查问的数据段。分页键通常是一个 惟一的标识符,能够示意查问后果集中的某一行。在应用分页键的时候,通过查问分页键来定位后果集的起始地位,从而防止了偏移量很大的状况,也就是防止了 SQL 深分页的状况。

举个例子,假如咱们须要查问一个蕴含一百万行数据的用户表,并且咱们须要查问第 500001 到第 500100 行的数据。如果用偏移量的形式进行查问,须要查问前 5000000 行数据能力取得咱们须要的后果,这将导致查问性能十分低下。而应用分页键的形式,能够在查问时间接指定分页键的值,从而定位到后果集的起始地位,防止了大量的数据扫描。

应用分页键的时候,咱们须要抉择一个适合的字段作为分页键,并确保该字段具备唯一性。通常状况下,自增长主键或者工夫戳字段都是比拟好的抉择,分页键实用于有序数据集的分页查问

上面有一个具体的栗子

假如咱们有一个蕴含大量文章的表,每篇文章都有一个惟一编号 id 和公布工夫 publish_time 两个字段。咱们须要查问公布工夫在 2022 年 1 月 1 日到 2022 年 3 月 31 日之间的文章,并依照公布工夫进行排序,每页显示十篇文章,显示第六页的数据

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;

正文完
 0