MySQL 8.0 全新特性详解

图片

MySQL 8.0带来了许多令人兴奋的新特性和优化功能,下面我将逐一详细介绍每个特性:

一、原生数据字典

MySQL 8.0 引入了原生数据字典,取代了之前使用的.frm、.par、.opt等文件来存储元数据。这一改进使得元数据的访问和管理更加高效和直接。原生数据字典提供了对数据库对象元数据的统一视图,从而简化了数据库的管理和维护工作。通过查询数据字典,管理员可以快速了解数据库的结构、属性以及对象之间的关系,提高数据库的可维护性。

要启用此功能,请在my.cnf配置文件中添加以下设置:

data-encryption-key-store = KEYSTOREdata-encryption-key-store-type = FILEdata-encryption-key-store-file-path = /path/to/keystore.txt

二、角色管理

MySQL 8.0 增强了角色管理功能,允许管理员创建和管理角色,并为每个角色分配特定的权限。这使得权限管理变得更加灵活和便捷。通过角色管理,管理员可以将一组权限打包成一个角色,然后将该角色分配给多个用户,从而简化了权限的分配和回收过程。同时,角色管理还提供了权限继承、角色组合等高级功能,进一步增强了权限管理的灵活性和安全性。

通过以下命令创建角色:

CREATE ROLE 'role_name';

然后,您可以使用GRANT语句为角色分配权限:

GRANT SELECT, INSERT ON database_name.table_name TO 'role_name';

最后,将角色分配给用户:

ALTER USER 'user_name'@'localhost' ADD ROLE 'role_name';

三、窗口函数

MySQL 8.0 加入了窗口函数支持,如ROW_NUMBER()、RANK()、DENSE_RANK()等。窗口函数允许用户在查询中对数据集进行窗口分析,执行更复杂的计算任务。这使得MySQL在数据处理和分析方面的能力得到了显著提升。通过窗口函数,用户可以轻松地计算移动平均值、累计总和等,实现更高级的数据分析需求。

窗口函数有点像是 SUM()、COUNT() 那样的集合函数,但它并不会将多行查询结果合并为一行,而是将结果放回多行当中。也就是说,窗口函数是不需要 GROUP BY 的。

假设我们有一张 “班级学生人数” 表:​​​​​​​

mysql> select * from classes;+--------+-----------+| name   | stu_count |+--------+-----------+| class1 |        31 || class2 |        33 || class3 |        52 || class4 |        53 || class5 |        57 |+--------+-----------+5 rows in set (0.00 sec)

如果我要对班级人数从小到大进行排名,可以这样利用窗口函数:​​​​​​​

mysql> select *, rank() over w as `rank` from classes    -> window w as (order by stu_count);+--------+-----------+------+| name   | stu_count | rank |+--------+-----------+------+| class5 |        57 |    1 || class1 |        31 |    2 || class2 |        33 |    3 || class3 |        52 |    4 || class4 |        53 |    4 |+--------+-----------+------+5 rows in set (0.00 sec)

在这里我们创建了名为 w 的 window,规定它对 stu_count 字段进行排序,然后在 select 子句中对 w 执行 rank() 方法,将结果输出为 rank 字段。

其实,window 的创建是可选的。例如我要在每一行中加入学生总数,则可以这样:​​​​

mysql> select *, sum(stu_count) over() as total_count    -> from classes;+--------+-----------+-------------+| name   | stu_count | total_count |+--------+-----------+-------------+| class1 |        31 |         235 || class2 |        33 |         235 || class3 |        52 |         235 || class4 |        53 |         235 || class5 |        57 |         235 |+--------+-----------+-------------+5 rows in set (0.00 sec)

四、增强的JSON支持

MySQL 8.0 对JSON的支持进行了进一步增强,引入了JSON数据类型和一系列内置函数。JSON数据类型允许用户在列中直接存储JSON数据,提高了数据的灵活性和可读性。同时,MySQL 8.0还提供了一系列内置函数,如JSON_EXTRACT()、JSON_ARRAY()、JSON_OBJECT()等,用于提取、操作和验证JSON数据。这使得MySQL能够更好地处理非结构化数据,满足日益增长的数据处理需求。

例如,插入JSON数据到表中:

 INSERT INTO my_table (json_column) VALUES ('{"name": "John", "age": 30}');

查询JSON数据:

 SELECT JSON_EXTRACT(json_column, '$.name') AS name FROM my_table;

五、全球化与字符集

MySQL 8.0 默认采用utf8mb4字符集,提供了更完美的Unicode支持。这意味着MySQL 8.0可以更好地处理各种语言的数据,包括emoji字符等。同时,MySQL 8.0还增强了对不同语言、时区的支持,实现了更好的全球化。这使得MySQL成为了一个更加多语言、多文化的数据库管理系统,满足了全球化业务的需求。

六、性能与可扩展性提升

MySQL 8.0 针对InnoDB存储引擎进行了多方面的优化,包括I/O负载、元数据操作等。这些优化使得MySQL 8.0在性能和可扩展性方面有了显著提升。无论是处理大规模数据还是应对高并发场景,MySQL 8.0都能表现出色。同时,MySQL 8.0还提供了更多的配置选项和调优工具,帮助管理员更好地管理和优化数据库性能。

七、redo log重构

MySQL 8.0对redo log进行了重构,去掉了之前的锁机制,采用了区间的方式来保证数据的一致性。这种改进使得redo log的写入更加高效,提高了整体的运行效率。同时,MySQL 8.0还引入了Link_buf数据结构,使得整个模块变成了Lock_free的模式,进一步提升了性能。这种无锁化的重构使得不同的线程在写入redo_log_buffer时得以并行写入,从而提高了数据库的并发性能。

八、更简便的NoSQL支持

随着非关系型数据库和数据存储的兴起,MySQL 8.0也对NoSQL支持进行了优化。它不再依赖模式(schema),以更灵活的方式实现NoSQL功能,从而满足用户在数据处理方面的多样化需求。这使得MySQL能够更好地适应不同的应用场景,提供了更广泛的数据存储和查询选项。

九、更好的索引

MySQL 8.0新增了隐藏索引和降序索引等特性。隐藏索引可以用来测试去掉索引对查询性能的影响,帮助管理员找到最佳的索引策略。而降序索引则可以提高查询的效率,特别是对于需要按照降序排列的查询场景。这些索引优化使得MySQL在查询性能方面有了显著提升。

隐藏一个索引的语法是:

ALTER TABLE t ALTER INDEX i INVISIBLE;

恢复显示该索引的语法是:

ALTER TABLE t ALTER INDEX i VISIBLE;

当一个索引被隐藏时,我们可以从 show index 命令的输出中看到,该索引的 Visible 属性值为 NO。

注意:当索引被隐藏时,它的内容仍然是和正常索引一样实时更新的,这个特性本身是专门为优化调试使用。如果你长期隐藏一个索引,那还不如干脆删掉,因为毕竟索引的存在会影响插入、更新和删除的性能。

十、设置持久化

MySQL 8.0新增了SET PERSIST命令,允许用户将配置持久化到数据目录下的mysqld-auto.cnf文件中。这样,即使数据库重启,之前的配置也会得到保留,从而简化了配置管理的工作。这使得管理员可以更加方便地管理和调整数据库的配置,提高了数据库的可维护性。

操作 SET PERSIST 命令,例如:

SET PERSIST max_connections = 500;

MySQL 会将该命令的配置保存到数据目录下的 mysqld-auto.cnf 文件中,下次启动时会读取该文件,用其中的配置来覆盖缺省的配置文件。

总结

总的来说,MySQL 8.0的这些新特性在数据管理、安全性、性能优化等多个方面进行了改进,为用户提供了更加高效、灵活和安全的数据库管理系统。无论是处理大规模数据、应对高并发场景还是满足多样化的数据处理需求,MySQL 8.0都能提供出色的支持。

图片

  • 30
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
升级MySQL 8.0的步骤如下: 1. 首先,执行mysql_upgrade命令。在MySQL 8中,mysql_upgrade客户端已被弃用,升级操作现在由服务器完成。因此,您需要使用较旧的数据目录启动新的MySQL二进制文件。执行mysql_upgrade命令后,服务器将自动修复用户表,而无需重新启动。\[1\] 2. 确保MySQL服务已启动。您可以使用以下命令检查MySQL的版本:`mysql> select version();`。如果版本显示为8.0.19,则表示您正在使用MySQL 8.0.19版本。\[2\] 3. 启动新的MySQL软件并启动数据库。您可以使用以下命令启动MySQL服务:`/opt/mysql/product/percona8.0/bin/mysqld_safe --defaults-file=/data/mysql3072/my_mysql3072.cnf > update.log 2>&1 &`。请确保替换命令中的路径和文件名以匹配您的实际设置。\[3\] 请注意,这只是升级MySQL 8.0的一般步骤,具体操作可能因环境和配置而有所不同。在进行任何升级操作之前,请务必备份您的数据库以防止数据丢失。 #### 引用[.reference_title] - *1* *2* [MySQL 5.7升级8.0过程(详解)](https://blog.csdn.net/m0_38048955/article/details/127360747)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [手把手教你升级到MySQL 8.0](https://blog.csdn.net/Alen_Liu_SZ/article/details/125107558)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值