mysql8.0新特性

1、默认字符集由latin1变为utf8mb4

在5.6、5.7版本中,默认字符集均为latin1,在8.0版本中,默认字符集已经变为utf8mb4

2、系统表不再使用MyISAM和MEMORY

执行select distinct(ENGINE) from information_schema.tables;获取当前系统表使用到的存储引擎。

在5.6、5.7版本中查询结果为:MEMORY、InnoDB、MyISAM、CSV、PERFORMANCE_SCHEMA

在8.0版本中查询结果为:InnoDB、PERFORMANCE_SCHEMA、CSV

可以看到,MySQL8.0版本中,系统表存储引擎已经取消了使用MyISAM和MEMORY。

3、支持在线修改全局参数并持久化

通过加上PERSIST关键字,可以将修改的参数持久化到新的配置文件(mysqld-auto.cnf)中,重启MySQL时,可以从该配置文件获取到最新的配置参数。

例如执行:

# 8.0版本中,设置binlog日志过期时间为7天
set PERSIST binlog_expire_logs_seconds=604800;

系统会在数据目录下生成mysqld-auto.cnf 文件,该文件内容是以json格式存储的。当my.cnf 和mysqld-auto.cnf 同时存在时,后者优先级更高。

# mysqld-auto.cnf 文件
{
    "binlog_expire_logs_seconds": {
        "Value": "604800",
        "Metadata": {
            "Timestamp": 1629252257908278,
            "User": "root",
            "Host": ""
        }
    }
}

4、binlog日志过期时间精确到秒,之前是天,并且参数名称发生变化。

在8.0版本之前,binlog日志过期时间设置都是设置expire_logs_days参数,而在8.0版本中,MySQL默认使用binlog_expire_logs_seconds参数。

5、新增降序索引

MySQL在语法上很早就已经支持降序索引,但实际上创建的仍然是升序索引,但在8.0版本中,这种情况得到消除,创建的是降序索引,实际上就是降序索引。

不过值得注意的是,创建降序索引需要严格考虑业务场景,否则创建降序索引可能效率还不如正常的升序索引。

# MySQL 5.7
# 创建表
create table t1(c1 int,c2 int,index idx_c1_c2(c1,c2 desc));
# 查看表结构
CREATE TABLE `t1` (
  `c1` int(11) DEFAULT NULL,
  `c2` int(11) DEFAULT NULL,
  KEY `idx_c1_c2` (`c1`,`c2`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
# MySQL 5.7
# 创建表
create table t1(c1 int,c2 int,index idx_c1_c2(c1,c2 desc));
CREATE TABLE `t1` (
  `c1` int DEFAULT NULL,
  `c2` int DEFAULT NULL,
  KEY `idx_c1_c2` (`c1`,`c2` DESC)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;

6、支持隐式索引

在 MySQL 8.0 中,索引可以被“隐藏”和“显示”。

当对索引进行隐藏时,它不会被查询优化器所使用。我们可以使用这个特性用于性能调试,例如我们先隐藏一个索引,然后观察其对数据库的影响。如果数据库性能有所下降,说明这个索引是有用的,然后将其“恢复显示”即可;如果数据库性能看不出变化,说明这个索引是多余的,可以考虑删掉。

使用INVISIBLE关键字在创建表或者进行表变更中设置索引是否可见。索引不可见只是在查询时优化器不使用该索引,即使使用force index,优化器也不会使用该索引,同时优化器也不会报索引不存在的错误,因为索引仍然真实存在。

# 创建不可见索引
create table t2(c1 int,c2 int,index idx_c1_c2(c1,c2 desc) invisible );
# 索引可见
alter table t2 alter index idx_c1_c2 visible;
# 索引不可见
alter table t2 alter index idx_c1_c2 invisible;

7、JSON特性增强

MySQL 8 大幅改进了对JSON 的支持,添加了基于路径查询参数从JSON字段中抽取数据的JSON_EXTRACT() 函数,以及用于将数据分别组合到JSON 数组和对象中的JSON_ARRAYAGG() 和JSON_OBJECTAGG() 聚合函数。

8、窗口函数(Window Functions)

从 MySQL 8.0 开始,新增了一个叫窗口函数的概念。

它可以用来实现若干新的查询方式。窗口函数与 SUM()、COUNT() 这种聚合函数类似,但它不会将多行查询结果合并为一行,而是将结果放回多行当中。即窗口函数不需要 GROUP BY

9、select ... for update添加跳过锁等待

select ... for update,select ... for share(8.0新增语法) 添加NOWAIT、SKIP LOCKED语法,跳过锁等待,或者跳过锁定。

在5.7及之前的版本,select...for update,如果获取不到锁,会一直等待,直到innodb_lock_wait_timeout超时。

在8.0版本中,通过添加nowait,skip locked语法,能够立即返回。如果查询的行已经加锁,那么nowait会立即报错返回,而skip locked也会立即返回,只是返回的结果中不包含被锁定的行。

10、支持直方图

优化器会利用column_statistics的数据,判断字段的值的分布,得到更准确的执行计划。

可以使用ANALYZE TABLE table_name [UPDATE HISTOGRAM on colume_name with N BUCKETS |DROP HISTOGRAM ON clo_name] 来收集或者删除直方图信息。

直方图统计了表中某些字段的数据分布情况,为优化选择高效的执行计划提供参考,直方图与索引有着本质的区别,维护一个索引有代价。每一次的insert、update、delete都会需要更新索引,会对性能有一定的影响。而直方图一次创建永不更新,除非明确去更新它。所以不会影响insert、update、delete的性能。

# 添加/更新直方图
mysql>analyze table t1 update histogram on c1, c2 with 32buckets;
+--------+-----------+----------+-----------------------------------------------+
|Table  |Op |Msg_type|Msg_text  |
+--------+-----------+----------+-----------------------------------------------+
|db.t1 |histogram|status  |Histogramstatistics created forcolumn 'c1'. |
|db.t1 |histogram|status  |Histogramstatistics created forcolumn 'c2'. |
+--------+-----------+----------+-----------------------------------------------+
2rows inset (2.57sec)

# 删除直方图
mysql>analyze table t1 drop histogram on c1, c2;
+--------+-----------+----------+-----------------------------------------------+
|Table  |Op |Msg_type|Msg_text  |
+--------+-----------+----------+-----------------------------------------------+
|db.t1 |histogram|status  |Histogramstatistics removed forcolumn 'c1'. |
|db.t1 |histogram|status  |Histogramstatistics removed forcolumn 'c2'. |
+--------+-----------+----------+-----------------------------------------------+
2rows inset (0.13sec)

11、新增innodb_dedicated_server参数

能够让InnoDB根据服务器上检测到的内存大小自动配置innodb_buffer_pool_size,innodb_log_file_size,innodb_flush_method三个参数。

12、新增角色管理

角色可以认为是一些权限的集合,为用户赋予统一的角色,权限的修改直接通过角色来进行,无需为每个用户单独授权。

# 创建角色
mysql> create role 'test_role';
Query OK, 0 rows affected (0.00 sec)

# 给角色授予权限
mysql> grant select on *.* to test_role;
Query OK, 0 rows affected (0.01 sec)

# 创建用户
mysql> create user 'read_user'@'%' identified by '123456';
Query OK, 0 rows affected (0.01 sec)

# 给用户赋予角色
mysql> grant 'test_role' to 'read_user';
Query OK, 0 rows affected (0.00 sec)

# 给角色增加insert权限
mysql> grant insert on *.* to 'test_role';
Query OK, 0 rows affected (0.00 sec)

# 移除角色insert权限
mysql> revoke insert on *.* from 'test_role';
Query OK, 0 rows affected (0.01 sec)

# 查看角色与用户关系
mysql>select *from mysql.role_edges;
+-----------+-----------+---------+-----------+-------------------+
|FROM_HOST|FROM_USER|TO_HOST|TO_USER  |WITH_ADMIN_OPTION|
+-----------+-----------+---------+-----------+-------------------+
|%  |role_test |%  |read_user |N  |
+-----------+-----------+---------+-----------+-------------------+
1row inset (0.00sec)

# 查看用户当前拥有的角色
mysql> show grants for 'read_user';
+------------------------------------------------------------+
| Grants for read_user@%                                     |
+------------------------------------------------------------+
| GRANT USAGE ON *.* TO `read_user`@`%`                      |
| GRANT `insert_role`@`%`,`test_role`@`%` TO `read_user`@`%` |
+------------------------------------------------------------+

# 删除角色
mysql>drop role test_role;
QueryOK, 0rows affected (0.06sec)

注:在8.0版本之前,比如5.6和5.7版本,仅支持针对单个用户设置权限,而没有角色的概念。

13、默认认证插件更改为caching_sha2_password

5.7版本中默认认证插件是mysql_native_password,在8.0版本中默认的认证插件变为了caching_sha2_password。

可以使用命令show variables like 'default_authentication_plugin%';来查询MySQL默认的认证插件。

对于8.0之前的版本,只要用户的密码一样,加密出的密文串也是一样的。但在8.0版本中,即使两个用户的密码是相同的,但加密出的密文串也不会相同。

在这点上,降低了用户密码被破解的可能性。

14、新增密码记录功能

该功能可以记录用户使用该密码的次数,控制相同密码的使用次数。借此可以强制用户定期修改密码

15、InnoDB DDl语句支持原子操作

MySQL5.7执行drop命令 drop table t1,t2; 如果t1存在,t2不存在,会提示t2表不存在,但是t1表仍然会被删除。

MySQL8.0执行同样的drop命令,会提示t2表不存在,而且t1表不会被删除,保证了原子性。

<think>好的,用户想了解MySQL 8.0新特性和功能改进。我需要先回忆一下MySQL 8.0的主要更新点,并结合提供的引用内容来组织答案。首先,用户给的引用里提到了优化器的改进、InnoDB的优化、LIMIT语法的调整等。这些都是关键点,需要详细说明。 首先,我应该从性能优化开始,尤其是优化器和InnoDB的改进,因为引用1和2都提到了这些。然后,新特性方面,比如窗口函数、通用表表达式、JSON增强,这些都是MySQL 8.0的重要更新。接着是管理方面的改进,比如角色管理、原子DDL,这些对数据库管理很有帮助。安全性也是不可忽视的部分,比如密码策略和权限调整。还有字符集默认改为utf8mb4,这点需要强调。最后,其他特性如隐藏索引、资源组、备份锁等,这些可能用户也会感兴趣。 需要确保回答结构清晰,分点列出,每个部分有子项。同时,要检查引用是否正确对应,比如引用1提到LIMIT语法的调整,引用2提到InnoDB优化。还要注意使用正确的LaTeX格式,比如本号中的点可能需要用数学模式,但用户示例中没有特别处理,可能直接写8.0即可。 可能用户是数据库管理员或开发者,所以需要结合实际应用场景,说明这些特性如何提升性能或简化工作。比如原子DDL可以减少数据字典错误,窗口函数方便数据分析。同时,要避免技术术语过于晦涩,保持易懂。 最后,生成的相关问题要围绕用户可能进一步关心的方面,比如如何升级、性能对比、具体功能的使用方法等。确保问题有针对性,能帮助用户深入理解。</think>### MySQL 8.0 新特性及功能改进 #### 一、性能优化 1. **优化器改进** MySQL 8.0 对优化器进行了全面重构,支持更智能的查询执行计划选择。例如,新增了 **直方图统计信息**,优化器能更精确地估算数据分布,提升复杂查询效率[^1]。 $$ \text{查询性能提升} \propto \text{统计信息精度} $$ 2. **InnoDB 存储引擎增强** - 元数据操作优化:减少表锁竞争,提升 DDL 操作(如 `ALTER TABLE`)的并发性[^2]。 - 并行索引构建:加速索引创建速度,支持多线程构建 B+ 树索引。 - 事务性能提升:通过优化 Undo 日志管理和 MVCC 机制,减少高并发场景下的锁争用。 #### 二、新功能特性 1. **窗口函数(Window Functions)** 支持 `ROW_NUMBER()`、`RANK()`、`LEAD()` 等分析函数,简化复杂数据分析操作,例如: ```sql SELECT name, salary, RANK() OVER (ORDER BY salary DESC) AS rank FROM employees; ``` 2. **通用表表达式(CTE)** 通过 `WITH` 子句实现递归查询和复杂逻辑分层,提升 SQL 可读性: ```sql WITH RECURSIVE cte AS ( SELECT 1 AS n UNION ALL SELECT n+1 FROM cte WHERE n < 10 ) SELECT * FROM cte; ``` 3. **JSON 增强** - 新增 `JSON_TABLE` 函数,支持将 JSON 数据转换为关系表格式。 - 优化 JSON 路径表达式性能,支持部分更新(`JSON_REPLACE`、`JSON_SET`)。 4. **角色管理** 支持角色(Role)的创建、分配和权限继承,简化权限管理: ```sql CREATE ROLE 'developer'; GRANT SELECT ON db.* TO 'developer'; ``` #### 三、管理与运维改进 1. **原子 DDL(Atomic DDL)** 确保 DDL 操作(如 `CREATE TABLE`)的原子性,避免部分执行导致的数据字典不一致[^2]。 2. **默认字符集改为 `utf8mb4`** 支持完整的 Unicode 字符(包括 Emoji 和生僻字),解决 `utf8` 字符集的历史限制。 3. **资源组(Resource Groups)** 允许为线程分配 CPU 资源,优化多工作负载场景下的资源分配: ```sql CREATE RESOURCE GROUP batch_group TYPE=USER VCPU=2-3; ``` #### 四、安全性提升 1. **密码策略增强** - 默认启用 `caching_sha2_password` 认证插件,替代旧的 `mysql_native_password`。 - 支持密码有效期、历史密码复用限制等策略。 2. **权限管理优化** - 动态权限系统:细化权限控制粒度(如 `BACKUP_ADMIN`、`ROLE_ADMIN`)。 - 禁止隐式授权:`GRANT` 命令必须显式指定权限。 #### 五、其他关键改进 1. **隐藏索引(Invisible Indexes)** 允许将索引标记为“隐藏”,用于测试索引删除对性能的影响: ```sql CREATE INDEX idx ON table(col) INVISIBLE; ``` 2. **备份锁(Backup Lock)** 新增 `LOCK INSTANCE FOR BACKUP` 语句,减少备份期间对业务的影响。 3. **LIMIT 语法调整** 支持更灵活的 `LIMIT ... OFFSET` 写法,两种形式等效[^1]: ```sql SELECT * FROM table LIMIT 5 OFFSET 10; -- 等效于 LIMIT 10,5 ``` #### 六、升级与兼容性 - 支持在线升级(需通过 `mysql_upgrade` 工具完成元数据更新)[^3]。 - 弃用 `MyISAM` 存储引擎的部分功能,推荐优先使用 InnoDB。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值