当前位置: 首页 > news >正文

MySQL 8.0 新特性详解与实用示例

MySQL 8.0 新特性详解与实用示例

1. 引言

MySQL 8.0 是 MySQL 版本系列中具有里程碑意义的更新版本,带来了大量新功能和优化,极大地提升了数据库的性能和可用性。本文将深入介绍 MySQL 8.0 的主要新特性及其应用场景,帮助你在项目中更高效地使用这些新功能。


2. MySQL 8.0 新特性概览

2.1 窗口函数(Window Functions)

窗口函数提供了在不更改查询结果行数的前提下进行聚合计算的能力。

应用场景

  • 计算排名
  • 累计求和
  • 统计窗口范围内的值

示例代码

-- 查询每个部门员工的工资排名
SELECT name, department, salary,
RANK() OVER (PARTITION BY department ORDER BY salary DESC) AS rank
FROM employees;

常用窗口函数

  • RANK():返回排名,存在相同值时会跳过排名。
  • ROW_NUMBER():返回连续的行号。
  • DENSE_RANK():返回连续排名,不跳过排名。
  • SUM() OVER:计算累积和。

2.2 通用表表达式(Common Table Expressions,CTE)

CTE 提供了一种临时的命名结果集,可以在查询中多次引用,增强了查询的可读性和复用性。

示例代码

WITH dept_avg_salary AS (SELECT department, AVG(salary) AS avg_salaryFROM employeesGROUP BY department
)
SELECT e.name, e.salary, d.avg_salary
FROM employees e
JOIN dept_avg_salary d ON e.department = d.department
WHERE e.salary > d.avg_salary;

优势

  • 简化复杂查询
  • 支持递归查询

2.3 JSON 数据类型增强

MySQL 8.0 加强了对 JSON 数据类型的支持,包括新函数和优化。

示例代码

-- 插入 JSON 数据
INSERT INTO orders (order_details) VALUES ('{"product": "手机", "quantity": 2}');-- 查询 JSON 数据中的具体字段
SELECT order_details->>'$.product' AS product_name FROM orders;

常用 JSON 函数

  • JSON_EXTRACT(json_doc, path):提取 JSON 数据。
  • JSON_CONTAINS(json_doc, value):检查 JSON 字段是否包含指定值。

2.4 GIS 功能增强

MySQL 8.0 提升了对地理空间数据类型和函数的支持。

示例代码

-- 创建地理空间表
CREATE TABLE locations (id INT AUTO_INCREMENT PRIMARY KEY,name VARCHAR(50),coordinates POINT NOT NULL,SPATIAL INDEX(coordinates)
);-- 插入地理位置数据
INSERT INTO locations (name, coordinates) VALUES ('公园', ST_GeomFromText('POINT(120.5 35.2)'));-- 查询距离指定点 10 公里范围内的地标
SELECT * FROM locations
WHERE ST_Distance_Sphere(coordinates, ST_GeomFromText('POINT(120.5 35.2)')) <= 10000;

应用场景

  • LBS(基于位置的服务)
  • 地理范围查询

2.5 索引增强功能

MySQL 8.0 改进了索引功能,支持更高级的索引类型。

  • 隐藏索引(Invisible Index):可以隐藏索引,使其在查询优化中被忽略。
  • 降序索引(Descending Index):提升了对降序查询的性能支持。

示例代码

-- 创建隐藏索引
CREATE INDEX idx_salary ON employees(salary);
ALTER TABLE employees ALTER INDEX idx_salary INVISIBLE;-- 创建降序索引
CREATE INDEX idx_join_date_desc ON employees(join_date DESC);

应用场景

  • 隐藏索引用于测试索引对性能的影响而无需删除索引。
  • 降序索引用于优化降序排序查询。

2.6 数据字典(Data Dictionary)

MySQL 8.0 引入了统一的数据字典,消除了 .frm 文件,提升了元数据管理的效率和一致性。

特点

  • 元数据存储在 InnoDB 表中。
  • 提升了启动速度和表操作性能。

2.7 DDL 原子性

在 MySQL 8.0 中,DDL 操作(如 ALTER TABLECREATE TABLE)具有原子性,保证了操作的成功性和一致性。

示例

-- 如果 `CREATE TABLE` 操作失败,则自动回滚
CREATE TABLE IF NOT EXISTS employees_backup LIKE employees;

2.8 新的字符集默认支持 UTF-8(utf8mb4)

MySQL 8.0 默认使用 utf8mb4 字符集,全面支持 4 字节的 Unicode 字符(例如 emoji)。

示例代码

-- 创建支持 emoji 字符的表
CREATE TABLE messages (id INT AUTO_INCREMENT PRIMARY KEY,content VARCHAR(255) CHARACTER SET utf8mb4
);-- 插入包含 emoji 的数据
INSERT INTO messages (content) VALUES ('Hello 🌟!');

优势:避免了以往 utf8 字符集无法存储 4 字节字符的问题。


3. 查询优化工具增强

MySQL 8.0 提供了增强的 EXPLAINOPTIMIZER_TRACE 工具,可以帮助开发者更好地分析和优化查询。

示例

-- 使用 EXPLAIN 查看查询计划
EXPLAIN FORMAT=JSON SELECT * FROM employees WHERE salary > 5000;-- 启用查询优化跟踪
SET optimizer_trace='enabled=on';
SELECT * FROM employees;
SHOW OPTIMIZER_TRACE;

4. 总结

MySQL 8.0 引入了大量创新功能,如窗口函数、CTE、JSON 增强、GIS 查询和索引优化等,使其在查询和性能优化方面更加强大。熟练掌握这些新特性可以大幅提高开发效率和数据库性能。在项目开发中,合理运用这些特性将帮助你构建更高效的数据库系统。

相关文章:

MySQL 8.0 新特性详解与实用示例

MySQL 8.0 新特性详解与实用示例 1. 引言 MySQL 8.0 是 MySQL 版本系列中具有里程碑意义的更新版本&#xff0c;带来了大量新功能和优化&#xff0c;极大地提升了数据库的性能和可用性。本文将深入介绍 MySQL 8.0 的主要新特性及其应用场景&#xff0c;帮助你在项目中更高效地…...

【STM32-学习笔记-5-】ADC

文章目录 ADCADC函数Ⅰ、ADC_InitTypeDef结构体参数①、ADC_Mode②、ADC_DataAlign③、ADC_ExternalTrigConv④、ADC_ContinuousConvMode⑤、ADC_ScanConvMode⑥、ADC_NbrOfChannel Ⅱ、ADC配置示例1、单次转换&#xff0c;非扫描单次转换非扫描模式下&#xff0c;获取多通道的…...

TY1801 反激变换器PWM GaN功率开关

TY1801 是一款针对离线式反激变换器的多模式 PWM GaN 功率开关。TY1801 内置 GaN 功率管,它具备超宽 的 VCC 工作范围&#xff0c;非常适用于 PD 快充等要求宽输出电压的应用场合,系统不需要使用额外的绕组或外围降压电路&#xff0c;节省系统 BOM 成本。TY1801 支持 Burst&…...

Jenkins安装、插件下载及构建环境配置详解

Jenkins简介 1.1 简介 Jenkins 是一个基于Java开发的开源持续集成工具&#xff0c;它提供了一个开放且易用的软件平台&#xff0c;主要用于自动化构建、测试和部署软件项目&#xff0c;以实现持续集成&#xff08;CI&#xff09;和持续交付/部署&#xff08;CD&#xff09;。…...

ESP32,uart安装驱动uart_driver_install函数剖析,以及intr_alloc_flags 参数的意义

在 uart_driver_install 函数中&#xff0c;参数 RX_BUF_SIZE * 2 指定了接收缓冲区&#xff08;RX buffer&#xff09;的大小。这个参数对于 UART 驱动程序来说非常重要&#xff0c;因为它决定了可以存储多少接收到的数据&#xff0c;直到应用程序读取它们为止。下面是对该函数…...

Ubuntu把应用程序放到桌面

有时候我们下载的软件是一个文件夹&#xff0c;通常需要进入进入指定文件夹下去执行.sh 文件来启动&#xff0c;下面来个实例如何把idea放到桌面 打开文件目录/usr/share/applications/或者~/.local/share/applications/目录。第一个目录是全局的&#xff0c;所有用户都可以使…...

什么是端口映射

端口映射 端口映射&#xff08;Port Mapping&#xff09;是一种网络技术&#xff0c;用于将外部网络请求转发到内部网络的特定设备或服务。它通常用于以下场景&#xff1a; 外部访问内部服务&#xff1a;允许外部用户通过公网IP访问内网中的设备或服务。多设备共享IP&#xf…...

数据结构《MapSet哈希表》

文章目录 一、搜索树1.1 定义1.2 模拟实现搜索 二、Map2.1 定义2.2 Map.Entry2.3 TreeMap的使用2.4 Map的常用方法 三、Set3.1 定义3.2 TreeSet的使用3.3 Set的常用方法 四、哈希表4.1 哈希表的概念4.2 冲突4.2.1 冲突的概念4.2.2 冲突的避免1. 选择合适的哈希函数2. 负载因子调…...

【QT】QComboBox:activated信号和currentIndexChanged信号的区别

目录 1、activated1.1 原型1.2 触发机制1.3 使用场景1.4 连接信号和槽的方法1.4.1 方式一1.4.2 方式二 2、currentIndexChanged2.1 原型2.2 触发机制2.3 使用场景2.4 连接信号和槽的方法 1、activated 1.1 原型 [signal] void QComboBox::activated(int index) [signal] void…...

【Block总结】ELGCA模块,池化-转置(PT)注意力和深度卷积有效聚合局部和全局上下文信息

ELGCA结构 论文题目&#xff1a;ELGC-Net: Efficient Local-Global Context Aggregation for Remote Sensing Change Detection 论文链接&#xff1a;https://arxiv.org/pdf/2403.17909 官方github&#xff1a;https://github.com/techmn/elgcnet 高效局部-全局上下文聚合器&…...

MERN全栈脚手架(MongoDB、Express、React、Node)与Yeoman详解

MERN 全栈脚手架是一种用于快速构建基于 MongoDB、Express、React 和 Node.js 的全栈应用的框架或模板。它帮助开发者快速启动项目&#xff0c;减少了从零开始配置的时间。以下是关于 MERN 全栈脚手架的详细解析。 一、MERN 技术栈简介 MongoDB: 文档型数据库&#xff0c;用于…...

基于springboot+vue+微信小程序的宠物领养系统

基于springbootvue微信小程序的宠物领养系统 一、介绍 本项目利用SpringBoot、Vue和微信小程序技术&#xff0c;构建了一个宠物领养系统。 本系统的设计分为两个层面&#xff0c;分别为管理层面与用户层面&#xff0c;也就是管理者与用户&#xff0c;管理权限与用户权限是不…...

如何使用策略模式并让spring管理

1、策略模式公共接口类 BankFileStrategy public interface BankFileStrategy {String getBankFile(String bankType) throws Exception; } 2、策略模式业务实现类 Slf4j Component public class ConcreteStrategy implements BankFileStrategy {Overridepublic String ge…...

react中hooks之useRef 用法总结

1. 基本概念 useRef 是 React 的一个 Hook&#xff0c;返回一个可变的 ref 对象&#xff0c;其 .current 属性被初始化为传入的参数。这个对象在组件的整个生命周期内保持不变。 2. 主要用途和特性 2.1 获取 DOM 元素实例 function TextInputWithFocusButton() {const inpu…...

使用 Docker 部署 Java 项目(通俗易懂)

目录 1、下载与配置 Docker 1.1 docker下载&#xff08;这里使用的是Ubuntu&#xff0c;Centos命令可能有不同&#xff09; 1.2 配置 Docker 代理对象 2、打包当前 Java 项目 3、进行编写 DockerFile&#xff0c;并将对应文件传输到 Linux 中 3.1 编写 dockerfile 文件 …...

如何在Ubuntu上安装和配置Git

版本控制系统&#xff08;VCS&#xff09;是软件开发过程中不可或缺的工具之一&#xff0c;它帮助开发者跟踪代码变更、协作开发以及管理不同版本的项目。Git作为当前最流行的分布式版本控制系统&#xff0c;因其高效性和灵活性而广受青睐。本文将指导你如何在Ubuntu操作系统上…...

FPGA 21 ,深入理解 Verilog 中的基数,以及二进制数与十进制数之间的关系( Verilog中的基数 )

目录 前言 一. 基数基础 1.1 基数介绍 2.1 基数符号 3.1 二进制数 二. 二进制与十进制数 三. 二进制数 3.1 定义寄存器类型变量 3.2 定义线网类型变量 3.3 赋值操作 3.4 解析二进制数为十进制数 四. 代码示例 五. 注意事项 六. 更多操作 前言 在Verilog中&#…...

【redis】redis-cli命令行工具的使用

redis-cli命令行工具是一个功能强大的Redis客户端&#xff0c;它允许用户与Redis数据库进行交互和管理。 以下是一些常用参数的使用说明&#xff1a; 基本连接参数 -h, --host <hostname>&#xff1a;指定要连接的Redis服务器的主机名或IP地址。如果未指定&#xff0c;…...

使用Matplotlib显示中文的方法

1 问题提出 使用图1所示的代码进行matplotlib绘图时&#xff0c;因为其默认不支持中文&#xff0c;此时无法显示正确内容&#xff0c;如图2所示。 图1 matplotlib绘图绘图代码 图2 matplotlib无法显示中文 2 问题解决 2.1 设置全局字体 在图1所示的代码中&#xff0c;第13…...

SQL Server2022详细安装教程

1. 打开SQL Server官网&#xff1a;SQL Server 下载 | Microsoft 2. 选择Developer版 3. 下载好安装包&#xff0c;打开&#xff0c;选择自定义 4. 选择下载位置&#xff0c;最好不要在C盘即主磁盘即可。等待下载 5. 下载成功之后会弹出这个框 6. 点击“安装”&#…...

铭豹扩展坞 USB转网口 突然无法识别解决方法

当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…...

【Python】 -- 趣味代码 - 小恐龙游戏

文章目录 文章目录 00 小恐龙游戏程序设计框架代码结构和功能游戏流程总结01 小恐龙游戏程序设计02 百度网盘地址00 小恐龙游戏程序设计框架 这段代码是一个基于 Pygame 的简易跑酷游戏的完整实现,玩家控制一个角色(龙)躲避障碍物(仙人掌和乌鸦)。以下是代码的详细介绍:…...

逻辑回归:给不确定性划界的分类大师

想象你是一名医生。面对患者的检查报告&#xff08;肿瘤大小、血液指标&#xff09;&#xff0c;你需要做出一个**决定性判断**&#xff1a;恶性还是良性&#xff1f;这种“非黑即白”的抉择&#xff0c;正是**逻辑回归&#xff08;Logistic Regression&#xff09;** 的战场&a…...

解决Ubuntu22.04 VMware失败的问题 ubuntu入门之二十八

现象1 打开VMware失败 Ubuntu升级之后打开VMware上报需要安装vmmon和vmnet&#xff0c;点击确认后如下提示 最终上报fail 解决方法 内核升级导致&#xff0c;需要在新内核下重新下载编译安装 查看版本 $ vmware -v VMware Workstation 17.5.1 build-23298084$ lsb_release…...

大语言模型如何处理长文本?常用文本分割技术详解

为什么需要文本分割? 引言:为什么需要文本分割?一、基础文本分割方法1. 按段落分割(Paragraph Splitting)2. 按句子分割(Sentence Splitting)二、高级文本分割策略3. 重叠分割(Sliding Window)4. 递归分割(Recursive Splitting)三、生产级工具推荐5. 使用LangChain的…...

数据链路层的主要功能是什么

数据链路层&#xff08;OSI模型第2层&#xff09;的核心功能是在相邻网络节点&#xff08;如交换机、主机&#xff09;间提供可靠的数据帧传输服务&#xff0c;主要职责包括&#xff1a; &#x1f511; 核心功能详解&#xff1a; 帧封装与解封装 封装&#xff1a; 将网络层下发…...

MySQL 8.0 OCP 英文题库解析(十三)

Oracle 为庆祝 MySQL 30 周年&#xff0c;截止到 2025.07.31 之前。所有人均可以免费考取原价245美元的MySQL OCP 认证。 从今天开始&#xff0c;将英文题库免费公布出来&#xff0c;并进行解析&#xff0c;帮助大家在一个月之内轻松通过OCP认证。 本期公布试题111~120 试题1…...

大学生职业发展与就业创业指导教学评价

这里是引用 作为软工2203/2204班的学生&#xff0c;我们非常感谢您在《大学生职业发展与就业创业指导》课程中的悉心教导。这门课程对我们即将面临实习和就业的工科学生来说至关重要&#xff0c;而您认真负责的教学态度&#xff0c;让课程的每一部分都充满了实用价值。 尤其让我…...

在QWebEngineView上实现鼠标、触摸等事件捕获的解决方案

这个问题我看其他博主也写了&#xff0c;要么要会员、要么写的乱七八糟。这里我整理一下&#xff0c;把问题说清楚并且给出代码&#xff0c;拿去用就行&#xff0c;照着葫芦画瓢。 问题 在继承QWebEngineView后&#xff0c;重写mousePressEvent或event函数无法捕获鼠标按下事…...

逻辑回归暴力训练预测金融欺诈

简述 「使用逻辑回归暴力预测金融欺诈&#xff0c;并不断增加特征维度持续测试」的做法&#xff0c;体现了一种逐步建模与迭代验证的实验思路&#xff0c;在金融欺诈检测中非常有价值&#xff0c;本文作为一篇回顾性记录了早年间公司给某行做反欺诈预测用到的技术和思路。百度…...