日常开发记录分享-SQL中的partition分区功能使用

文章目录

  • 需求来源
  • 实现思路
  • 实施
      • SQL 语句结构
        • 内部查询(子查询)
        • 外部查询
      • 结果
  • partition的升级使用
      • 解释
    • 验证一下看看分区
  • 分区的一些操作
      • 1. 普通查询
      • 2. 分区表上的查询优化
      • 3. 插入数据
      • 4. 删除分区中的数据
      • 5. 分区维护操作
        • 添加新的分区
        • 删除分区
        • 重组分区
      • 6. 检查分区信息
      • 总结

需求来源

今天甲方这边要查看一个机车的周时数据(就是一个机车从到我的管辖范围内,到出我的管辖内所用的时间),那这个它会跑很多次,我们要查询这一天的周时数据,锚定一个点比如出管辖区的时间,那么根据查询到今天所有这个时间范围内出去的车信息,然后去数据表里找这个机车进来的数据且时最新的一条就行了。

实现思路

分两次查询的第一次查询出来所有的当天出管辖区的机车信息,第二个查询是根据第一个查询小小的改动,把时间范围去掉就好,然后根据机车信息进行组取时间每个机车时间最新的数据就好。直接使用group by,但是这个并不能取出其它的信息所以就pass掉了。GPTl了一下给的方案是使用partition这个功能。

实施

就不看项目数据了就看一下我写的小demo的结果吧。我有一个student表,这个表里有10个班的学生,每个班的学生有20个,我现在要取出每个班的学生id最大的这个记录,就可以使用这个partition了。
在这里插入图片描述

select * from (SELECT *, ROW_NUMBER() over (partition by classes_id order by id desc) as rn FROM `student`) a where rn=1

在这里插入图片描述
解释一下这个啊。

这条 SQL 语句使用了窗口函数 ROW_NUMBER() 来为每个 classes_id 组中的行编号,并在外部查询中只选择每个 classes_id 组中的最新一行(根据 id 倒序排序)。以下是对这条 SQL 语句的详细解释:

SQL 语句结构

SELECT * 
FROM (SELECT *, ROW_NUMBER() OVER (PARTITION BY classes_id ORDER BY id DESC) AS rn FROM `student`
) a 
WHERE rn = 1;
内部查询(子查询)
SELECT *, ROW_NUMBER() OVER (PARTITION BY classes_id ORDER BY id DESC) AS rn 
FROM `student`
  1. SELECT *

    • 选择 student 表中的所有列。
  2. ROW_NUMBER() OVER (PARTITION BY classes_id ORDER BY id DESC) AS rn

    • ROW_NUMBER() 是一个窗口函数,它为结果集中的每一行分配唯一的行号。
    • OVER 子句定义了窗口的分区和排序规则:
      • PARTITION BY classes_id:将结果集按 classes_id 列进行分组。对于每个 classes_id,将重新开始编号。
      • ORDER BY id DESC:在每个 classes_id 分区中,按照 id 列的降序排序。
    • AS rn:将生成的行号列命名为 rn

    这部分查询为每个 classes_id 组中的行编号,编号从1开始,按照 id 倒序排列。因此,rn 为1的行是每个 classes_id 组中 id 最大的行。

外部查询
SELECT * 
FROM (SELECT *, ROW_NUMBER() OVER (PARTITION BY classes_id ORDER BY id DESC) AS rn FROM `student`
) a 
WHERE rn = 1;
  1. FROM (...) a

    • 将内部查询的结果作为一个临时表 a
  2. WHERE rn = 1

    • 筛选出临时表 arn 等于 1 的行,即每个 classes_id 组中 id 最大的行。

结果

整个查询的作用是:

  • student 表进行分组(按 classes_id)。
  • 在每个 classes_id 组中,按 id 倒序排列,并为每行分配一个行号 rn
  • 选择每个 classes_id 组中 rn 等于 1 的行(即每个 classes_id 组中 id 最大的行)。

partition的升级使用

partition不仅仅可以在日常查询中使用,还可以在表的数据结构上进行优化,比如在建表的时候创建分区或者后期添加分区,这个分区操作是在物理上的操作,可以看我下面这张表的结构,有一部分注释说明就是分区的设置,

在这里插入图片描述

对表进行分区可以提升查询性能和数据管理的效率。由于 ENGINE=MyISAM 不支持分区,我们需要将表的存储引擎更改为 InnoDB,因为 InnoDB 支持分区。

假设我们要根据 id 列进行范围分区,将数据划分为四个分区:

  1. p0:包含 id 小于 10000的数据。
  2. p1:包含 id 小于 20000的数据。
  3. p2:包含 id 小于 50000的数据。
  4. p3:包含其余的数据。

PARTITION BY RANGE (id) (PARTITION p0 VALUES LESS THAN (10000),PARTITION p1 VALUES LESS THAN (20000),PARTITION p2 VALUES LESS THAN (50000),PARTITION p3 VALUES LESS THAN MAXVALUE
);

解释

  • PARTITION BY RANGE (id): 根据 id 列进行范围分区。
  • PARTITION p0 VALUES LESS THAN (10000): 第一个分区,包含 id 小于 10000的数据。
  • PARTITION p1 VALUES LESS THAN (20000): 第二个分区,包含 id 小于 20000的数据。
  • PARTITION p2 VALUES LESS THAN (50000): 第三个分区,包含 id 小于 50000的数据。
  • PARTITION p3 VALUES LESS THAN MAXVALUE: 第四个分区,包含 id 大于等于 50000的数据。

这样,表 products 就被划分为四个分区,每个分区包含一定范围的 id 值的数据。

验证一下看看分区

上面说了创建分区了,但是怎么才能确定我们的查询sql使用到了分区呢?使用explain来查看执行的sql有没有在分区的范围呢,
下面是使用了explain查看执行的sql有没有用到分区,partition的值为p0对应了上面设置的分区。

在这里插入图片描述

分区的一些操作

创建分区后,数据库管理系统会自动处理分区的数据存储和检索,用户在日常操作中并不需要特殊处理分区。不过,你可以通过一些特定的查询和操作来利用分区的优势。以下是一些常见的用法示例:

1. 普通查询

普通的查询不需要特别处理分区,数据库管理系统会自动根据分区优化查询:

SELECT * FROM student WHERE id < 50;

2. 分区表上的查询优化

当你的查询条件包含分区键时,数据库会自动选择相关的分区进行查询,从而提高查询性能。例如:

SELECT * FROM student WHERE id BETWEEN 50 AND 100;

3. 插入数据

插入数据时,数据库会根据分区键自动将数据插入到相应的分区:

INSERT INTO student (name, classes_id) VALUES ('Alice', 1);

4. 删除分区中的数据

可以通过分区键删除特定分区中的数据:

DELETE FROM student WHERE id < 50;

5. 分区维护操作

你可以进行一些特定的分区维护操作,例如合并分区、拆分分区、删除分区等:

添加新的分区
ALTER TABLE student ADD PARTITION (PARTITION p4 VALUES LESS THAN (200)
);
删除分区
ALTER TABLE student DROP PARTITION p0;
重组分区

可以将多个分区合并为一个分区:

ALTER TABLE student REORGANIZE PARTITION p1, p2 INTO (PARTITION p1_2 VALUES LESS THAN (150)
);

6. 检查分区信息

你可以使用 SHOW 语句查看表的分区信息:

SHOW CREATE TABLE student;

总结

综合示例展示了如何创建分区表、插入数据以及进行查询和维护操作:

-- 创建分区表
CREATE TABLE `student` (`id` int NOT NULL AUTO_INCREMENT,`name` varchar(255) DEFAULT NULL,`classes_id` int DEFAULT NULL,PRIMARY KEY (`id`),KEY `FK4l5dnicegnvpmu0pv6vdvrmb6` (`classes_id`)
) ENGINE=InnoDB AUTO_INCREMENT=201 DEFAULT CHARSET=utf8mb3
PARTITION BY RANGE (id) (PARTITION p0 VALUES LESS THAN (50),PARTITION p1 VALUES LESS THAN (100),PARTITION p2 VALUES LESS THAN (150),PARTITION p3 VALUES LESS THAN MAXVALUE
);-- 插入数据
INSERT INTO student (name, classes_id) VALUES ('Alice', 1);
INSERT INTO student (name, classes_id) VALUES ('Bob', 2);-- 查询数据
SELECT * FROM student WHERE id < 50;-- 删除分区中的数据
DELETE FROM student WHERE id < 50;-- 添加新分区
ALTER TABLE student ADD PARTITION (PARTITION p4 VALUES LESS THAN (200)
);-- 删除分区
ALTER TABLE student DROP PARTITION p0;-- 检查分区信息
SHOW CREATE TABLE student;

目前先整理这么多,以后有深入学习使用了再继续!!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/48673.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

银河麒麟服务器V10 SP3 安装人大金仓V009R001C001B0030

原文链接&#xff1a;银河麒麟服务器V10 SP3 安装人大金仓V009R001C001B0030 Hello&#xff0c;大家好啊&#xff0c;今天给大家带来一篇关于在银河麒麟服务器V10 SP3上安装人大金仓V009R001C001B0030的文章。人大金仓是国内知名的数据库管理系统&#xff0c;它在高性能、高可靠…

【C++】标准库:介绍string类

string 一.string类介绍二.string类的静态成员变量三.string类的常用接口1.构造函数&#xff08;constructor&#xff09;2.析构函数&#xff08;destructor&#xff09;3.运算符重载&#xff08;operator&#xff09;1.operator2.operator[]3.operator4.operator 4.string的四…

算法从零到精通 (一) ~ 快慢双指针

1. 前言 快慢双指针是一种常用的算法技巧&#xff0c;通常用于解决涉及链表或数组的问题。它的基本思想是使用两个指针&#xff0c;一个移动速度快&#xff08;快指针&#xff09;&#xff0c;一个移动速度慢&#xff08;慢指针&#xff09;&#xff0c;来解决特定的问题。这两…

Docker搭建群晖

Docker搭建群晖 本博客介绍在docker下搭建群晖 1.编辑docker-compose.yml文件 version: "3" services:dsm:container_name: dsmimage: vdsm/virtual-dsm:latestenvironment:DISK_SIZE: "16G"cap_add:- NET_ADMIN ports:- 8080:50…

c# 端口监控 Helper 以及写一个端口监控工具

c# 端口监控 Helper 以及写一个端口监控工具 介绍核心代码&#xff1a;工具完整编码&#xff1a;1、编写界面2、打开定时控件的属性设置。3、编写定时控件的 Tick 事件结果&#xff08;运行效果&#xff09; 介绍 由于最近做上架比较多&#xff0c;会经常来确保服务器的服务&a…

Flink时间和窗口

目录 时间语义 水位线&#xff08;Watermarks&#xff09; 并行流中的水位线 窗口 滚动窗口—Tumbling Windows 滑动窗口—Sliding Windows 会话窗口—Session Windows 全局窗口—Global Windows 例子 时间语义 如图所示&#xff0c;由事件生成器&#xff08;Event Pr…

萤石举办2024夏季新品发布会,全力推进“2+5+N”智能家居新生态

7月24日&#xff0c;“智动新生&#xff0c;尽在掌控”2024萤石夏季新品发布会在杭州成功举办。本次发布会上&#xff0c;“智慧生活守护者”萤石深入挖掘应用场景&#xff0c;重磅发布了包括智能健康手表、智能家居AI主机、生态控制器、智家APP等多款创新性的产品及应用&#…

【JavaScript】`Map` 数据结构

文章目录 一、Map 的基本概念二、常见操作三、与对象的对比四、实际应用场景 在现代 JavaScript 中&#xff0c;Map 是一种非常重要且强大的数据结构。与传统的对象&#xff08;Object&#xff09;不同&#xff0c;Map 允许您使用各种类型的值作为键&#xff0c;不限于字符串或…

基于 HTML+ECharts 实现监控平台数据可视化大屏(含源码)

构建监控平台数据可视化大屏&#xff1a;基于 HTML 和 ECharts 的实现 监控平台的数据可视化对于实时掌握系统状态、快速响应问题至关重要。通过直观的数据展示&#xff0c;运维团队可以迅速发现异常&#xff0c;优化资源配置。本文将详细介绍如何利用 HTML 和 ECharts 实现一个…

关于 夜莺n9e 的简易部署

一、部署夜莺n9e 1.找一个服务器机器 #创建并进入目录 mkdir -p /data/n9e && cd /data/n9e2.准备n9e安装包 (如果存在&#xff0c;跳过) #下载并解压n9e wget https://download.flashcat.cloud/n9e-v6.7.3-linux-amd64.tar.gz tar -zxvf n9e-v6.7.3-linux-amd64.ta…

JL 跳转指令的理解

一般情况下&#xff0c;JU 和 JC 是最常见的跳转指令&#xff1b;但有时会用到JL 指令&#xff0c;JL 说起来更像是一组指令&#xff0c;类似C,C# 语言中的 switch case 语句&#xff0c;但是有个明显的不同&#xff0c;前者的判断条件可以是任意合理数字&#xff0c;后者范围…

制冷系统干燥过滤器

干燥过滤器(Drier Filter)主要是起到杂质过滤的作用。一般来说&#xff0c;这要根据冰箱、空调的制冷系统来确定干燥器的规格&#xff0c;如直径&#xff0c;内径&#xff0c;外径的规格&#xff0c;和内部件&#xff0c;如过滤碗&#xff0c;网布&#xff0c;和分子筛 为了确保…

C#测试控制台程序调用Quartz.NET的基本用法

Quartz.Net是常用的任务调用框架之一&#xff0c;既能在客户端程序中使用&#xff0c;也支持在网页程序后台调用。本文结合参考文献4中的示例代码学习其在控制台程序中的基本用法。   VS2022新建控制台项目&#xff0c;在Nuget包管理器中搜索并安装Quartz包&#xff0c;如下所…

JavaWeb笔记_JSPEL

一.JSP相关技术 1.1 JSP由来 当我们需要向页面输出大量的HTML代码的时候,我们需要通过response对象写多次来输出HTML代码 response.getWriter().write("<font>文本</font>"); 页面的展示和servlet密不可分,不利于后期代码维护,因此推出一种可以…

npm下载pnpm

一、提供node_global和node_cache的文件夹 若不存在&#xff0c;可自行新建文件夹 二、配置环境变量 配置NODE_PATH变量&#xff1a; 配置Path变量&#xff1a; 三、执行cmd指令 npm config set prefix "D:\Configure\nodejs\node_global" npm config set cache &…

公司邮箱一般是什么邮箱

公司邮箱一般是什么邮箱呢&#xff1f;公司邮箱是企业官方通信工具&#xff0c;体现专业形象&#xff0c;提高协作效率。选择时需考虑安全性、功能集成、性价比和技术支持。Zoho邮箱因简洁界面、丰富协作工具和出色安全性能受好评&#xff0c;提供多种套餐选择。 一、公司邮箱…

编写SpringBoot的自定义starter包

starter项目 先来看一下Starter的官方解释&#xff1a; Spring Boot Starter 是一种方便的依赖管理方式&#xff0c;它封装了特定功能或技术栈的所有必要依赖项和配置&#xff0c;使得开发者可以快速地将这些功能集成到Spring Boot项目中。Spring Boot官方提供了一系列的Star…

接入百度文心一言API教程

然后&#xff0c;编辑文章。点击AI识别摘要&#xff0c;然后保存即可 COREAIPOWER设置 暂时只支持经典编辑器.古腾堡编辑器等几个版本后支持.在比期间,你可以自己写点摘要 摘要内容 AL识别摘要 清空 若有收获&#xff0c;就点个赞吧 接入文心一言 现在百度文心一言&…

vsftpd搭建FTP服务器 - 虚拟用户

命令记录 $ sudo apt install vsftpd db-util $ sudo nano /etc/vsftpd.conf $ sudo nano /etc/vsftpd/vsftpd-virtual-users.txt $ sudo db_load -T -t hash -f /etc/vsftpd/vsftpd-virtual-users.txt /etc/vsftpd/vsftpd-virtual-users.db ls /etc/vsftpd/vsftpd-virtual-us…

IDEA的pom.xml显示ignored 的解决办法

问题&#xff1a; idea中创建Maven module时&#xff0c;pom.xml出现ignored。 原因&#xff1a; 相同名称的module在之前被创建删除过&#xff0c;IDEA会误以为新的同名文件是之前删除掉的&#xff0c;将这个新的module的pom.xml文件忽略掉显示ignored. 解决&#xff1a; 在…