MySQL 8 新特性详解

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: MySQL 8 新特性详解

1. 隐藏索引(Hidden Indexes)

在MySQL 8之前,当你不再需要某个索引时,你必须显式地删除它。然而,在某些情况下,你可能不确定删除索引是否会对查询性能产生负面影响。为了解决这个问题,MySQL 8引入了隐藏索引的特性。隐藏索引允许你将索引设置为不可见,而不是完全删除它。这样,你可以在不实际删除索引的情况下评估查询的性能。如果发现性能下降,你可以轻松地使索引再次可见。

创建一个隐藏索引:

CREATE INDEX idx_hidden ON mytable(column1) ALGORITHM=INPLACE LOCK=NONE VISIBLE=FALSE;

将现有索引设置为隐藏:

ALTER INDEX idx_visible VISIBLE=FALSE ON mytable;

2. 降序索引(Descending Indexes)

在之前的MySQL版本中,索引总是按升序存储的。然而,在某些情况下,你可能希望按降序排序数据。MySQL 8现在支持降序索引,这意味着你可以在创建索引时指定索引列的排序顺序。这对于那些需要按降序排序数据的查询来说非常有用,因为它可以消除额外的排序步骤,从而提高查询性能。

CREATE INDEX idx_descending ON mytable(column1 DESC);

3. GROUP BY操作的改变

在MySQL 8之前,当你执行一个包含GROUP BY子句的查询时,MySQL会隐式地对结果进行排序。然而,这种行为并不总是符合用户的期望,而且可能会导致不必要的性能开销。为了解决这个问题,MySQL 8更改了GROUP BY的行为,使其不再隐式地对结果进行排序。如果你需要排序结果,你必须显式地使用ORDER BY子句。

在MySQL 8之前,以下查询会隐式地对结果进行排序:

SELECT column1, COUNT(*) FROM mytable GROUP BY column1;


在MySQL 8中,如果你需要排序结果,必须显式地添加ORDER BY子句:

SELECT column1, COUNT(*) FROM mytable GROUP BY column1 ORDER BY column1 DESC;

4. 索引中的函数表达式

在之前的MySQL版本中,索引只能基于列的原始值创建。然而,在某些情况下,你可能希望对列的值进行某种转换或计算后再创建索引。MySQL 8现在支持在索引中使用函数表达式,这意味着你可以在创建索引时应用函数来转换或计算列的值。这使得你可以根据特定的需求创建更加灵活和高效的索引。

创建一个基于函数表达式的索引:

CREATE INDEX idx_function ON mytable(UPPER(column1));

5. 原子DDL操作

数据定义语言(DDL)操作,如CREATE TABLE、ALTER TABLE和DROP TABLE,在之前的MySQL版本中可能不是原子的。这意味着在执行DDL操作时,其他用户可能会看到不一致的状态。MySQL 8通过引入原子DDL操作来解决这个问题。现在,当你执行一个DDL操作时,它会作为一个原子单元执行,确保在操作过程中数据库的一致性。

执行一个原子DDL操作(例如添加一个新列):

ALTER TABLE mytable ADD COLUMN new_column INT, ALGORITHM=INSTANT LOCK=NONE;

6. 行缓存(Row-Based Caching)

MySQL 8引入了行缓存的特性,以提高查询性能。行缓存允许MySQL在内存中缓存查询结果的一行或多行数据。当后续查询请求相同的数据时,MySQL可以直接从缓存中获取结果,而无需重新执行查询。这可以显著减少查询执行时间和数据库负载。

7. 改进的成本模型

MySQL的优化器使用成本模型来评估不同查询执行计划的成本,并选择最优的计划。在MySQL 8中,成本模型得到了改进,以更准确地估计查询的成本。这使得优化器能够做出更好的决策,从而提高查询性能。

8. 自增列持久化

在之前的MySQL版本中,自增列的值是在内存中维护的。然而,如果数据库服务器突然崩溃,那么自增列的值可能会丢失。MySQL 8通过引入自增列持久化的特性来解决这个问题。现在,自增列的值会定期写入磁盘上的系统表中,以确保在数据库服务器重新启动后能够恢复正确的值。

9. 新的系统字典表

MySQL 8引入了一个新的系统字典表来存储数据库元数据信息。这些系统字典表提供了关于数据库对象(如表、列和索引)的详细信息。通过使用新的系统字典表,MySQL 8能够更有效地管理和访问元数据信息,从而提高查询性能和易用性。

查询表的信息:

SELECT * FROM information_schema.TABLES WHERE TABLE_SCHEMA = 'mydatabase';

10. 更好支持文档型数据库和JSON

随着文档型数据库和JSON数据的普及,MySQL 8加强了对这些类型数据的支持。现在,你可以使用更加灵活和高效的查询语法来检索和操作JSON数据。此外,MySQL 8还提供了一些新的函数和操作符来处理JSON数据,使得在MySQL中处理文档型数据变得更加简单和方便。

查询JSON字段中的值:

假设有一个名为mytable的表,其中包含一个名为json_column的JSON字段,你可以使用以下查询来检索JSON字段中的值:

SELECT json_column->'$.key' AS value FROM mytable WHERE json_contains(json_column, '"target_value"', '$.key');

11. 正则表达式增强

MySQL 8对正则表达式支持进行了增强,提供了更多的正则表达式函数和操作符。这些增强功能使得你可以使用更加强大和灵活的正则表达式来匹配和处理字符串数据。无论是进行简单的模式匹配还是复杂的文本处理任务,MySQL 8的正则表达式增强功能都能帮助你轻松完成。

使用正则表达式进行模式匹配:

假设有一个名为mytable的表,其中包含一个名为text_column的文本字段,你可以使用以下查询来使用正则表达式进行模式匹配:

SELECT * FROM mytable WHERE text_column REGEXP 'pattern';

12. 窗口函数

窗口函数是SQL中的一个强大特性,它允许你对查询结果的子集执行计算。MySQL 8现在支持窗口函数,这意味着你可以使用OVER子句来定义窗口,并使用各种聚合函数(如SUM、AVG和ROW_NUMBER)来计算窗口内的值。窗口函数对于处理排名、累计和移动平均等计算非常有用。

计算每行的累计总和:

假设有一个名为sales的表,其中包含amount和date字段,你可以使用以下查询来计算每行的累计总和:

SELECT date, amount, SUM(amount) OVER (ORDER BY date) AS cumulative_sum FROM sales;


详情请阅读: 深入MySQL窗口函数:原理和应用


结语

以上详细介绍了MySQL 8的一些重要新特性,并通过示例展示了如何在实际中使用这些特性。这些新特性包括隐藏索引、降序索引、GROUP BY操作的改变、索引中的函数表达式、原子DDL操作、行缓存相关说明、改进的成本模型、自增列持久化、新的系统字典表、对文档型数据库和JSON的更好支持、正则表达式增强以及窗口函数。这些特性在提升数据库性能、增强易用性和灵活性方面发挥了重要作用。


通过了解和掌握这些新特性,用户可以更加高效地管理和查询MySQL数据库。需要注意的是,虽然提到了行缓存,但MySQL 8本身并没有直接提供行缓存的特性,而是通过其他机制来提供类似的性能优势。总体而言,MySQL 8的这些新特性为用户提供了更强大、更灵活的数据库管理功能。


相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
6天前
|
存储 关系型数据库 MySQL
MySQL 8.0特性-自增变量的持久化
【11月更文挑战第8天】在 MySQL 8.0 之前,自增变量(`AUTO_INCREMENT`)的行为在服务器重启后可能会发生变化,导致意外结果。MySQL 8.0 引入了自增变量的持久化特性,将其信息存储在数据字典中,确保重启后的一致性。这提高了开发和管理的稳定性,减少了主键冲突和数据不一致的风险。默认情况下,MySQL 8.0 启用了这一特性,但在升级时需注意行为变化。
|
2月前
|
JSON 关系型数据库 MySQL
MySQL 8.0 新特性
MySQL 8.0 新特性
147 10
MySQL 8.0 新特性
|
2月前
|
存储 Oracle 关系型数据库
Oracle和MySQL有哪些区别?从基本特性、技术选型、字段类型、事务、语句等角度详细对比Oracle和MySQL
从基本特性、技术选型、字段类型、事务提交方式、SQL语句、分页方法等方面对比Oracle和MySQL的区别。
493 18
Oracle和MySQL有哪些区别?从基本特性、技术选型、字段类型、事务、语句等角度详细对比Oracle和MySQL
|
1月前
|
SQL 安全 关系型数据库
MySQL8.2有哪些新特性?
【10月更文挑战第3天】MySQL8.2有哪些新特性?
35 2
|
3月前
|
算法 关系型数据库 MySQL
一天五道Java面试题----第七天(mysql索引结构,各自的优劣--------->事务的基本特性和隔离级别)
这篇文章是关于MySQL的面试题总结,包括索引结构的优劣、索引设计原则、MySQL锁的类型、执行计划的解读以及事务的基本特性和隔离级别。
|
3月前
|
SQL 算法 关系型数据库
(二十)MySQL特性篇:2022年的我们,必须要懂的那些数据库新技术!
 MySQL数据库从1995年诞生至今,已经过去了二十多个年头了,到2022.04.26日为止,MySQL8.0.29正式发行了GA版本,在此之前版本也发生了多次迭代,发行了大大小小N多个版本,其中每个版本中都有各自的新特性,所有版本的特性加起来,用一本书的篇幅也无法完全阐述清楚,因此本章主要会挑重点特性来讲,具体各版本的特性可参考MySQL官网的开发手册。
148 1
|
5月前
|
关系型数据库 MySQL 测试技术
深入探索MySQL 8:隐藏索引与降序索引的新特性
深入探索MySQL 8:隐藏索引与降序索引的新特性
|
5月前
|
关系型数据库 MySQL 数据库
MySQL 8.0 新特性之不可见主键
【6月更文挑战第9天】MySQL 8.0 引入了不可见主键特性,提供更灵活的数据库管理方式。不可见主键能减少业务逻辑干扰,提高数据安全性和隐私,同时在某些场景下更适用。示例展示了如何创建和使用不可见主键,但需要注意它可能带来的理解和调试难题。此特性增加了设计和管理数据库的选项,适用于对数据隐私有高要求的场景。随着技术发展,不断学习和探索新特性将提升数据库性能和功能。
79 9
|
5月前
|
SQL JSON 关系型数据库
MySQL 8.0新特性?
【6月更文挑战第14天】MySQL 8.0新特性?
50 1
|
5月前
|
SQL 安全 关系型数据库
MySQL数据库——事务-简介、事务操作、四大特性、并发事务问题、事务隔离级别
MySQL数据库——事务-简介、事务操作、四大特性、并发事务问题、事务隔离级别
85 1