MySQL 8.0新特性

一. 账户与安全

MySQL 8中,用户创建与授权语句必须是分开执行。老版本是一个sql。

1. 查看用户信息

在这里插入图片描述

2. 用户权限管理范围

  1. 可以限制用户访问哪些库、哪些表
  2. 可以限制用户对哪些表执行SELECT、CREATE、DELETE、DELETE、ALTER等操作
  3. 可以限制用户登录的IP或域名
  4. 可以限制用户自己的权限是否可以授权给别的用户

3. 用户创建和授权

  • all privileges:表示将所有权限授予给用户。也可指定具体的权限,如:SELECT、CREATE、DROP等。

    可通过官网看权限类型

  • on:表示这些权限对哪些数据库和表生效,格式:数据库名.表名,这里写*表示所有数据库,所有表。如果我要指定将权限应用到test库a表中,可以这么写:test.a。

  • to:将权限授予哪个用户。格式:”用户名”@”登录IP或域名”。%表示没有限制,在任何主机都可以登录。比如:”zhp”@”192.0.0.%”,表示yangxin这个用户只能在192.0.0.* IP段登录。

  • identified by:指定用户登录密码。

  • with grant option:表示允许用户将自己权限授权给他人

-- 用户创建
create user 'zhp'@'%' identified by 'zhp.1221';

-- 用户授权
grant all privileges on *.* to 'zhp'@'%' with grant option;

-- 用户权限变更时,重新加载权限,将权限信息从内存写入数据库
flush privileges;

1) 创建并授权用户

创建zhp账户。密码zhp.1221

授权test数据库中的a表的所有权限。

允许zhp账户登录任何机器。

在这里插入图片描述

2)登录zhp,密码zhp.1221。验证数据库权限

没有指定information_schema数据库,为什么还会显示这个库的权限呢?

MySQL 允许所有用户看到系统数据库的名称和某些表的内容,以便他们能够查询关于自己数据库对象的元数据。

在这里插入图片描述

3)查看用户权限

show grants for 'zhp'@'%';

在这里插入图片描述

4)撤销用户权限

撤销用户test.a表的查看权限
在这里插入图片描述

登录用户zhp查看a表

权限拒绝
在这里插入图片描述

5)用户重命名&修改密码

⭐️用户重命名

rename user 'zhp'@'%' to 'zhang'@'%';

在这里插入图片描述

⭐️修改密码

set password for 'zhang'@'%' = '123456';

alter user 'zhang'@'%' identified by '123456';

在这里插入图片描述

⭐️账号登录
在这里插入图片描述

6)删除用户

-- 切库
use mysql;
-- 删用户
drop user 'zhang'@'%';

在这里插入图片描述

4. 认证插件更新

1)认证插件

MySQL 8.0中默认的身份认证插件是caching_sha2_password,替代了之前的mysql_native_password

show variables like 'default_authentication_plugin';

在这里插入图片描述

⭐️如果更新相关插件参数,则需对my.cnf文件进行修改,修改重启MySQL重启后才生效。

2)my.cnf文件&配置修改

⭐️如何知道my.cnf文件位置在哪?

mysql --help | grep my.cnf;

在这里插入图片描述

# mac安装的mysql软件不自带my.cnf

# 创建my.cnf
sudo touch /etc/my.cnf;
# 增加权限
sudo chmod 664 /etc/my.cnf;
# 修改配置
sudo vim /etc/my.cnf;

[mysqld]
# 端口修改
port=3307
# 修改验证身份插件
# default-authentication-plugin=mysql_native_password

# 重启mysql
sudo /usr/local/mysql/support-files/mysql.server restart

配置信息
在这里插入图片描述

重启mysql
在这里插入图片描述

验证更改的配置,连接端口是否生效
在这里插入图片描述

3. 密码管理

MySQL 8.0 开始允许限制重复使用以前密码(修改密码时)。并且还加入密码的修改管理功能。

show variables like 'password%';

在这里插入图片描述

通过mysql.user查看历史用户的限制密码次数

use mysql;
--查看限制重复使用以前密码
select user, Password_reuse_history from user;

⭐️修改限制重复使用以前密码,修改密码不能和最近3次一致

-- 全局策略
set persist password_history = 3;

-- 用户级别
alter user 'zhang'@'%' password history 3;

password_reuse_interval 则是按照天数来限定(不允许重复的)

password_require_current 是否需要校验旧密码(off 不校验、 on校验)(针对非root用户)

set persist password_require_current=on;

二. 索引增强

1. 隐藏索引

1)概念&应用场景

MySQL 8.0 开始支持隐藏索引(invisible index),不可见索引。

隐藏索引不会被优化器使用,但仍需要进行维护。

应用场景

  1. 软删除:线上表,进行删除索引,会消耗性能,在MySQL8中可以把指定的索引变成隐藏索引(索引为不可用,查询优化器也不可用),最后确定要删除索引,进行alter table 表名 drop index 索引名删除。
  2. 灰度发布:进行线上表的索引发布,索引创建,会对表的写操作阻塞住,极大消耗性能,这时可先创建一个隐藏索引,不影响当前生产环境。或者在线上进行一些索引测试,可以通过设置让mysql优化器可用这个隐藏索引,方便我们测试,后续会讲这个配置。

2)看索引可见性信息

-- create index 
create index idx_city on a (city) invisible;
-- 查看a表的索引信息
show index from a\G;

在这里插入图片描述

3)mysql查询优化器,看是否走idx_city索引

select city from a where city = '四川';

在这里插入图片描述

4)对隐藏索引进行测试

可通过优化开关,打开设置,方便对隐藏索引进行设置

-- 查看优化器开关各种参数配置
select @@optimizer_switch\G

在这里插入图片描述

红色部分默认,隐藏索引不可用,参数配置修改

  • 会话级别的设置只对当前连接有效。
  • 当客户端断开连接时,这些设置会被重置为默认值或全局设置的值
-- 会话级别设置查询优化器可看隐藏索引
set session optimizer_switch='use_invisible_indexes=on';

在这里插入图片描述

5)隐藏索引变成可见索引

-- 可见
alter table a alter index idx_city visible;
-- 不可见
alter table a alter index idx_city invisible;

6)键不能设置为隐藏索引(MySQL做了限制)

2. 降序索引

MySQL8.0 开始真正支持降序索引(descending index)。只有InnoDB存储引擎支持降序索引,只支持BTree降序索引。另外MySQL8.0不再对group by操作进行隐式排序。

https://dev.mysql.com/blog-archive/mysql-8-0-labs-descending-indexes-in-mysql/

3 函数索引

1)概念

查询如果加入函数,索引不生效,MySQL 8引入了函数索引。

MySQL8.0.13开始支持在索引使用函数(表达式)的值。支持降序索引,支持JSON数据的索引。

2)使用函数索引(表达式)

create table c (c1 varchar(10), c2 varchar(10));

-- 普通索引
create index idx_c1 on c (c1);
-- 大写函数索引
create index idx_func on c ((UPPER(c2)));

3)查看索引信息

show index from c\G

在这里插入图片描述

4)执行计划验证函数索引

-- 函数索引
explain select * from c where upper(c2) = 'TREE';
-- 普通索引
explain select * from c where upper(c1) = 'TREE';

在这里插入图片描述

5)使用函数索引(JSON)

-- 具体来说,您的语句尝试从 data 列中的 JSON 对象提取名为 "name" 的键的值,并将其转换为不超过25个字符的字符串,然后为此表达式创建索引。
create table d (data json, index((CAST(data->>'$.name' as char(25)))));

explain select * from d where CAST(data ->> '%$.name' as char(25)) = 'zhp';

6)函数索引基于虚拟列功能实现

函数索引在MySQL中相当于新增了一个列,这个列会根据指定的函数进行计算结果,然后使用函数索引时,用这个新增的计算列作为索引。

三. 通用表达式(CTE)

资料

MySQL8.0开始支持通用表达式(CTE)(common table expression),即WITH子句。

CTE(Common Table Exressions),是一个可以在单个语句范围内被创建的临时结果集,可在该语句中被多次引用。

1. 入门

-- 入门1
WITH cte (col1, col2) AS
(
  SELECT 1, 2
  UNION ALL
  SELECT 3, 4
)
SELECT col1, col2 FROM cte;


-- 入门2
-- cte临时结果集,被select n+1 from cte where n<10调用
WITH recursive cte(n) as
( select 1
  union ALL
  select n+1 from cte where n<10
)
select * from cte;


2. 案例

有个cte_test表,有idnameparent_id,查询每个员工的上下级关系

-- 创建表
create table cte_test
(
    id        int(10) primary key auto_increment,
    name      varchar(20),
    parent_id int(10)
);

-- 数据插入
insert into cte_test (name, parent_id)
values ('张三', 0),
       ('李四', 1),
       ('王五', 1),
       ('奥特曼', 2),
       ('喜羊羊', 2),
       ('懒羊羊', 4);
       
 -- 查询
 
with cte_view(id, name, parent_id) as(
  
 select id,name,parent_id from cte_test where parent_id = 0
  union all
  select c2.id, c2.name, concat(c1.parent_id, '-', c2.id)from cte_test as c1 inner join cte_test as c2
  on c1.id = c2.parent_id
)
select * from cte_view order by id;

在这里插入图片描述

使用通用表达式的好处就是上下级层级就算有3~n层,也可以帮我们遍历出来(parent_id默认父级id-子集id),而老的方式的写法SQL语句就需要调整。

总结:

通用表达式与派生类类似,就像语句级别的临时表或视图。CTE可以在查询中多次饮用,可以饮用其他CTE,CTE支持selectinsertupdatedelete等语句。

四. 窗口函数

1. 概念

MySQL 8.0支持窗口函数(Window Function),也称分析函数。窗口函数与分组聚合函数类似。但是每一行数据都生成一个结果。聚合窗口函数:sumavgcountmaxmin等等。

2. 建表&数据

create table func_test
(
    year    int(10),
    country varchar(10),
    product varchar(10),
    sum     int(10)
);

insert into func_test
values (2021, 'USA', 'photo', 1300),
       (2022, 'USA', 'photo', 1800),
       (2020, 'USA', 'photo', 2400),
       (2021, 'CHA', 'photo', 5300),
       (2022, 'CHA', 'photo', 7800),
       (2020, 'CHA', 'photo', 3400),
       (2021, 'JPA', 'photo', 3300),
       (2022, 'JPA', 'photo', 5800),
       (2020, 'JPA', 'photo', 6400),
       (2021, 'USA', 'TV', 3300),
       (2022, 'USA', 'TV', 800),
       (2020, 'USA', 'TV', 400),
       (2021, 'CHA', 'TV', 300),
       (2022, 'CHA', 'TV', 300),
       (2021, 'USA', 'TV', 800),
       (2020, 'CHA', 'TV', 400),
       (2021, 'JPA', 'TV', 300),
       (2022, 'JPA', 'TV', 800),
       (2020, 'JPA', 'TV', 400)

3. 普通的分组,聚合(以国家单位统计)

select country, sum(sum) from func_test group by country

在这里插入图片描述

4. 窗口函数(以国家汇总)

OVER (PARTITION BY country): 这指定了一个窗口函数,它将数据按照 country 列进行分组,并在每个分组内执行 SUM() 操作。

把国家进行sum汇总。并展示

select year, country, product, sum, sum(sum) over (partition by country) as country_sum
from func_test
order by country, year, product, sum

在这里插入图片描述

5. 窗口函数(计算平均值)

select year, country, product, sum, sum(sum) over (partition by country) as country_sum,
       avg(sum) over (partition by country) as country_sum
from func_test
order by country, year, product, sum

在这里插入图片描述

6. 窗口函数(排名)

用于计算分类排名的排名窗口函数,以及获取指定位置数据的取值窗口函数

SELECT
	YEAR,
	country,
	product,
	sum,
	row_number() over (ORDER BY sum) AS 'rank',
        rank() over (ORDER BY sum) AS 'rank_1'
FROM
	func_test;

在这里插入图片描述

7. 窗口函数(累积总和)

SELECT
	YEAR,
	country,
	product,
	sum,
	sum(sum) over (PARTITION by country order by sum rows unbounded preceding) as sum_1
FROM
	sales order by country,sum;

在这里插入图片描述

8. 更多窗口函数

https://dev.mysql.com/doc/refman/8.0/en/window-function-descriptions.html

五. 原子DDL操作

MySQL8.0开始支持原子DDL操作,其中与表相关的原子DDL只支持InnoDB存储引擎。

一个原子DDL操作内容包括:更新数据字段,存储引擎层操作,在binlog中记录DDL操作。

支持与表相关的DDL:数据库,表空间,表,索引的createalterdroptruncate table

支持的其他DDL:存储程序,触发器,视图,UPD的createdropalter.

支持账户管理相关的DDL:用户和角色createalterdroprenamegrantrevoke

-- 如果只有t1,没有表t2表。在MySQL5.7与8表现是不同的。
-- 5.7中会删除t1表。而在8中会报错,因为是原子操作。
drop table t1, t2;

六. JSON增强

MySQL - The JSON Data Type

七. InnoDB其他改进功能

1. 自增列持久化

MySQL 5.7以及早起版本,InnoDB自增列计数器(auto_increment)的值只存储在内存中。MySQL 8.0每次变化时将自增计数器的最大值写入redo log。同时在每次检查点将其写入引擎私有的系统表。解决了长期依赖的自增字段可能重复的bug。

2. 死锁检查控制

MySQL8.0增加一个新动态变量,用于控制系统是否执行InnoDB死锁检查。对于高并发系统,禁用死锁检查可能带来性能的提高。

show variables like 'innodb_deadlock_detect';

在这里插入图片描述

3. 锁定语句选项

select ... for shareselect ... for update 支持nowaitskiplocked选项。对于nowait,如果请求的行被其他事务锁定时,语句立即返回。对于skip locked,从返回的结果集中移除被锁定的行。

4. InnoDB其他改进功能

  1. 支持部分快速DDL,alter table algorithm=instant
  2. InnoDB临时表使用共享的临时表空间ibtmp1。
  3. 新增静态变量 innodb_dedicated_server,自动配置 InnoDB 内存参数:innodb_buffer_pool_size/innodb_log_file_size 等。
  4. 默认创建 2 个 UNDO 表空间,不再使用系统表空间。
  5. 支持 ALTER TABLESPACE … RENAME TO 重命名通用表空间。
<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、付费专栏及课程。

余额充值