0%

MySQL GROUP BY 分组优化:三种实现方式与性能对比

在 MySQL 中,GROUP BY 操作本质上包含 “排序” 和 “分组” 两个核心步骤,其性能很大程度上取决于是否能利用索引避免额外的排序或临时表。MySQL 实现 GROUP BY 主要有三种方式,性能从优到劣依次为:松散索引扫描紧凑索引扫描临时表

松散索引扫描(Loose Index Scan):性能最优

松散索引扫描是 GROUP BY 最理想的实现方式,它完全利用索引直接获取分组结果,无需扫描所有符合条件的数据,也无需创建临时表或排序,性能最佳。

核心原理

利用索引的有序性,直接定位每个分组的起始位置,跳过组内其他数据,仅读取分组所需的最小信息(如分组字段和聚合函数所需的值)。

例如,索引为 (c1, c2, c3),当 GROUP BY c1, c2 时,松散索引扫描会直接定位每个 (c1, c2) 组合的第一个索引项,即可完成分组,无需扫描组内的 c3 数据。

必须满足的条件

阅读全文 »

开机

  1. BIOS 初始化:计算机通电后,首先加载 BIOS(基本输入输出系统)。BIOS 是固化在主板 ROM 芯片中的程序,它负责执行加电自检(POST),检查 CPU、内存、显卡等关键硬件是否正常工作。同时,BIOS 会根据预设的启动顺序,查找可启动设备,如硬盘、光盘、U 盘等。
  2. 加载 MBR:当 BIOS 找到有效的可启动设备后,会将该设备启动盘的第一个扇区(即 MBR,主引导记录)加载到内存中。MBR 大小为 512 字节,其中包含了引导程序和分区表信息。引导程序的主要作用是引导操作系统的启动,而分区表则记录了硬盘的分区信息。
  3. 加载 GRUB2 核心映像:MBR 中的引导程序会执行 boot.img,boot.img 负责加载 GRUB2 的核心映像文件 core.img。core.img 由 diskboot.img、lzma_decompress.img、kernel.img 和一系列模块组成。
  4. 加载 GRUB2 模块及相关程序:diskboot.img 会将 core.img 的其他部分加载进来,首先显示解压缩程序 lzma_decompress.img,然后加载 kernel.img 和各个模块对应的映像。lzma_decompress.img 会将压缩的内核映像等数据解压缩,并将计算机从实模式转换为保护模式,建立分段分页机制,打开地址线,为后续操作系统的运行做好准备。
  5. 显示操作系统列表:kernel.img 中的 grub_main 程序会读取 GRUB2 的配置文件(通常为 /boot/grub/grub.cfg),并根据配置文件中的设置展示操作系统列表。用户可以在该列表中选择要启动的操作系统。
  6. 启动内核:当用户选择好操作系统后,GRUB2 会将对应的内核映像加载到内存中,并将控制权交给内核。内核开始初始化,会依次初始化 CPU、内存、存储设备等硬件,并加载必要的驱动程序,完成系统核心环境的建立,至此计算机开机过程进入操作系统启动阶段,后续将由操作系统负责完成剩余的初始化工作和服务启动等操作。

Spring MVC 之 RequestBodyAdvice 与 ResponseBodyAdvice:请求 / 响应增强的核心实践

在 Spring MVC 4.0+ 中,RequestBodyAdviceResponseBodyAdvice 是两个强大的请求 / 响应增强接口,分别用于在 @RequestBody 参数解析前 / 后、@ResponseBody 响应写入前对数据进行拦截和处理。它们摆脱了传统拦截器(HandlerInterceptor)只能操作 HttpServletRequest/HttpServletResponse 流的限制,可直接针对Java 对象级别的数据进行加工(如加密解密、日志记录、统一格式封装),是前后端数据交互中 “横切关注点” 处理的最佳方案。

从 “接口作用→核心方法→实现步骤→实战场景” 四个维度,彻底讲透这两个接口的使用逻辑与价值。

核心概念:为什么需要 RequestBodyAdvice/ResponseBodyAdvice?

在传统开发中,若需对 @RequestBody 请求(如 JSON 入参)或 @ResponseBody 响应(如 JSON 出参)进行统一处理(如:

  • 请求入参解密(前端加密传输,后端解密后解析);
  • 响应出参统一格式封装(所有接口返回 {code:0, msg:"success", data:{}});
  • 请求 / 响应日志记录(打印入参、出参详情,便于排查问题);
  • 数据校验增强(补充自定义校验逻辑,如 Token 合法性校验);

传统方案(如拦截器 HandlerInterceptor)需手动读取 / 写入请求 / 响应流,存在流不可重复读取数据格式解析复杂(如 JSON 字符串转 Java 对象)等问题。而 RequestBodyAdvice/ResponseBodyAdvice 直接在 Spring MVC 的参数解析 / 响应写入流程中拦截 Java 对象,无需处理流操作,开发效率和灵活性大幅提升。

RequestBodyAdvice:请求入参增强(@RequestBody 预处理)

RequestBodyAdvice 作用于标注 @RequestBody 的 Controller 方法参数,在参数被 HttpMessageConverter(如 Jackson)解析为 Java 对象前 / 后进行拦截处理,核心是 “加工请求数据,确保解析出的对象符合业务需求”。

1. 接口核心方法解析

RequestBodyAdvice 接口包含 4 个核心方法,执行顺序为:supports()handleEmptyBody()(可选)→ beforeBodyRead()afterBodyRead()

阅读全文 »

MySQL 数据备份与恢复全指南:策略、工具与实践

数据备份是数据库运维的核心环节,旨在应对人为误操作、软硬件故障、安全攻击等场景下的数据丢失风险。MySQL 提供了逻辑备份物理备份两大类方案,各有适用场景。本文详细解析各类备份与恢复方法,帮助选择合适的策略。

备份的核心场景

备份的必要性体现在以下场景:

数据丢失场景

  • 人为误操作(如误删表、更新错误);
  • 软件 Bug 或硬件故障(如磁盘损坏、数据库崩溃);
  • 恶意攻击(如数据篡改、勒索)。

非数据丢失场景

  • 时间点恢复(如回滚到某一历史状态);
  • 环境搭建(开发 / 测试环境同步生产数据);
  • 数据迁移(跨服务器、跨版本迁移)。

逻辑备份:基于 SQL 或文本的备份

逻辑备份通过导出数据的逻辑结构(表定义)和内容(SQL 语句或文本) 实现,优势是跨平台性好、可编辑,但速度较慢,适合中小型数据量。

生成 INSERT 语句备份(mysqldump)

mysqldump 是 MySQL 自带的逻辑备份工具,可导出数据库的表结构和数据为 SQL 脚本(包含 CREATE TABLEINSERT 语句)。

核心参数与示例
阅读全文 »

Spring Boot 属性绑定原理详解(基于 2.2.2.RELEASE):从注解到字段注入的全流程

Spring Boot 的 @ConfigurationProperties 注解能实现 “配置文件与 Java 类字段自动映射”,核心依赖 “注解驱动的后置处理器 + 配置源解析 + 字段赋值” 的联动机制。从 “注解入口→Bean 注册→后置处理器触发→实际绑定执行” 四个维度,拆解 2.2.2.RELEASE 版本的属性绑定原理,帮你理解 “配置文件中的 server.port=8081 如何自动赋值到 ServerProperties.port”。

属性绑定的入口:@EnableConfigurationProperties 注解

@ConfigurationProperties 本身仅标记 “该类是配置绑定类”,无法单独触发绑定 —— 真正的 “启动开关” 是 @EnableConfigurationProperties 注解,它通过导入 EnableConfigurationPropertiesRegistrar 类,完成属性绑定的 “基础设施搭建”。

1. @EnableConfigurationProperties 源码解析

1
2
3
4
5
6
7
8
9
10
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
// 核心:导入 Registrar 类,负责注册绑定所需的 Bean
@Import(EnableConfigurationPropertiesRegistrar.class)
public @interface EnableConfigurationProperties {

// 指定需要绑定的配置类(如 @EnableConfigurationProperties(ServerProperties.class))
Class<?>[] value() default {};
}
关键作用:
  • 显式指定需要绑定的配置类(如 ServerProperties),并将其注册为 Spring Bean;
  • 注册属性绑定的 “核心工具类”(如 ConfigurationPropertiesBindingPostProcessor),为后续绑定提供支持。

2. EnableConfigurationPropertiesRegistrar:Bean 注册的 “执行者”

EnableConfigurationPropertiesRegistrar 实现 ImportBeanDefinitionRegistrar 接口,在 Spring 解析配置类时,主动注册两类关键 Bean:

阅读全文 »