MySQL8.0新特性抢先看,性能又双叒提升了,真香啊

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
云数据库 RDS MySQL,高可用系列 2核4GB
简介: MySQL8.0新特性抢先看,性能又双叒提升了,真香啊

一、隐藏索引



隐藏索引的特性对于性能调试非常有用。

在 8.0 中,索引可以被“隐藏”和“显示”。当一个索引隐藏时,它不会被查询优化器所使用。

也就是说,我们可以隐藏一个索引,然后观察对数据库的影响。

如果数据库性能有所下降,就说明这个索引是有用的,于是将其“恢复显示”即可;

如果数据库性能看不出变化,说明这个索引是多余的,可以删掉了。


🍃 1.1 操作语句


创建索引的语法:

alter table t_index add index idx_col3(col3);


隐藏一个索引的语法:

mysql> ALTER TABLE t_index ALTER INDEX idx_col3 INVISIBLE;


恢复显示该索引的语法:

mysql> ALTER TABLE t_index ALTER INDEX idx_col3 VISIBLE;


Visible 属性:

mysql> show index from t_index;

46d57c9fb9e84aebbeac1c8f11409f38.png



🍃 1.2 注意事项

当索引被隐藏时,它的内容仍然是和正常索引一样实时更新的,

这个特性本身是专门为优化调试使用。

如果你长期隐藏一个索引,那还不如干脆删掉,

因为毕竟索引的存在会影响插入、更新和删除的性能。


🍁 二、参数设置持久化


MySQL 的设置可以在运行时通过 SET GLOBAL 命令来更改,

但是这种更改只会临时生效,到下次启动时数据库又会从配置文件中读取。


🍃 2.1 SET PERSIST 命令


MySQL 8 新增了 SET PERSIST 命令,例如:

mysql> set persist max_connections=300;

534a46b321c946c28141efba9d136c9b.png



🍃 2.2 数据字典查询


mysql> SELECT * FROM performance_schema.persisted_variables;



0956090641314efc9d53cc12122ee47f.png


🍃 2.3 持久化清除


对于已经持久化了变量,可通过 reset persist 命令清除掉,

注意,其只是清空 mysqld-auto.cnf 和 performance_schema.persisted_variables 中的内容,

对于已经修改了的变量的值,不会产生影响。

mysql> reset persist;

46960adca4e544f7b99322ca43b250ab.png

🍃 2.4 原理


MySQL 会将该命令的配置保存到数据目录下的 mysqld-auto.cnf 文件中,

下次启动时会读取该文件,用其中的配置来覆盖缺省的配置文件。

不建议手动修改该文件,因为其内容是 json 格式的,

其有可能导致数据库在启动过程中因解析错误而失败


🍁 三、UTF-8 编码



从 MySQL 8 开始,数据库的缺省编码将改为 utf8mb4,这个编码包含了所有 emoji 字符。

多少年来我们使用 MySQL 都要在编码方面小心翼翼,

生怕忘了将缺省的 latin 改掉而出现乱码问题。从此以后就不用担心了。


– 创建数据库

mysql> CREATE DATABASE mes_db charset utf8mb4;


🍁 四、表达式WITH



其实 WITH 表达式除了和 SELECT 一起用,有很多的组合:

insert with 、with update、with delete、with with、with recursive

(可以模拟数字、日期等序列)、WITH 可以定义多张表


🍃 4.1 生成日期序列

WITH recursive seq_date (log_date) AS
(SELECT
'2022-01-01'
UNION
ALL
SELECT
log_date + INTERVAL 1 DAY
FROM
seq_date
WHERE log_date + INTERVAL 1 DAY < '2022-01-14')
SELECT
log_date
FROM
seq_date;
+------------+
| log_date   |
+------------+
| 2022-01-01 |
| 2022-01-02 |
| 2022-01-03 |
| 2022-01-04 |
| 2022-01-05 |
| 2022-01-06 |
| 2022-01-07 |
| 2022-01-08 |
| 2022-01-09 |
| 2022-01-10 |
| 2022-01-11 |
| 2022-01-12 |
| 2022-01-13 |
+------------+
13 rows in set (0.00 sec)


🍃 4.2 多个表达式来 JOIN


复杂的查询会使用嵌入式表,例如:

SELECT t1., t2. FROM

(SELECT col1 FROM table1) t1,

(SELECT col2 FROM table2) t2;


而有了 CTE,我们可以这样写:

WITH

t1 AS (SELECT col1 FROM table1),

t2 AS (SELECT col2 FROM table2)

SELECT t1., t2.

FROM t1, t2;

这样看上去层次和区域都更加分明,改起来也更清晰的知道要改哪一部分。


🍁 五、窗口函数



🍃 5.1 新特性

MySQL 被吐槽最多的特性之一就是缺少 rank() 函数,

当需要在查询当中实现排名时,必须手写 @ 变量。但是从 8.0 开始,

MySQL 新增了一个叫窗口函数的概念,它可以用来实现若干新的查询方式。

窗口函数有点像是 SUM()、COUNT() 那样的集合函数,

但它并不会将多行查询结果合并为一行,而是将结果放回多行当中。

也就是说,窗口函数是不需要 GROUP BY 的。


🍃 5.2 建表


create table scores_tb (
id int auto_increment primary key,
xuehao int not null,
score int not null
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
insert into scores_tb 
(xuehao,score) 
values (1001,89),
(1002,99),
(1003,96),
(1004,96),
(1005,92),
(1006,90),
(1007,90),
(1008,94);
select * from scores_tb;


🍃 5.3 排序对比


按分数高低直接排名,从 1 开始,往下排,类似于 row number


5.7版本SQL如下:

SELECT xuehao, score, @curRank := @curRank + 1 AS rank

FROM scores_tb, (

SELECT @curRank := 0

) r

ORDER BY score desc;


8.0版本

select xuehao,score, ROW_NUMBER() OVER(order by score desc) as row_r from scores_tb;

bcd5d275b0ba4e0f8e0a13dfe1e5cdb2.png

3db2201042e948c89a2f377f8fa6fba9.png

相关实践学习
如何快速连接云数据库RDS MySQL
本场景介绍如何通过阿里云数据管理服务DMS快速连接云数据库RDS MySQL,然后进行数据表的CRUD操作。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
2月前
|
缓存 关系型数据库 MySQL
MySQL索引策略与查询性能调优实战
在实际应用中,需要根据具体的业务需求和查询模式,综合运用索引策略和查询性能调优方法,不断地测试和优化,以提高MySQL数据库的查询性能。
196 66
|
3月前
|
存储 关系型数据库 MySQL
提高MySQL查询性能的方法有很多
提高MySQL查询性能的方法有很多
231 7
|
3月前
|
存储 关系型数据库 MySQL
提高MySQL的查询性能
提高MySQL的查询性能
82 4
|
8天前
|
SQL 安全 关系型数据库
【MySQL基础篇】事务(事务操作、事务四大特性、并发事务问题、事务隔离级别)
事务是MySQL中一组不可分割的操作集合,确保所有操作要么全部成功,要么全部失败。本文利用SQL演示并总结了事务操作、事务四大特性、并发事务问题、事务隔离级别。
【MySQL基础篇】事务(事务操作、事务四大特性、并发事务问题、事务隔离级别)
|
2月前
|
关系型数据库 MySQL
mysql事务特性
原子性:一个事务内的操作统一成功或失败 一致性:事务前后的数据总量不变 隔离性:事务与事务之间相互不影响 持久性:事务一旦提交发生的改变不可逆
|
2月前
|
SQL 关系型数据库 MySQL
MySQL性能探究:count(*)与count(1)的性能对决
在MySQL数据库的性能优化中,对查询语句的细微差别有着深入的理解是非常重要的。`count(*)`和`count(1)`是两种常用的聚合函数,用于计算行数。在面试中,面试官经常会问到这两种函数的性能差异。本文将探讨`count(*)`与`count(1)`的性能对比,并整理十道经典的MySQL面试题,帮助你在面试中游刃有余。
87 3
|
2月前
|
存储 关系型数据库 MySQL
MySQL 8.0特性-自增变量的持久化
【11月更文挑战第8天】在 MySQL 8.0 之前,自增变量(`AUTO_INCREMENT`)的行为在服务器重启后可能会发生变化,导致意外结果。MySQL 8.0 引入了自增变量的持久化特性,将其信息存储在数据字典中,确保重启后的一致性。这提高了开发和管理的稳定性,减少了主键冲突和数据不一致的风险。默认情况下,MySQL 8.0 启用了这一特性,但在升级时需注意行为变化。
|
2月前
|
缓存 监控 关系型数据库
如何根据监控结果调整 MySQL 数据库的参数以提高性能?
【10月更文挑战第28天】根据MySQL数据库的监控结果来调整参数以提高性能,需要综合考虑多个方面的因素
91 1
|
2月前
|
监控 关系型数据库 MySQL
如何监控和诊断 MySQL 数据库的性能问题?
【10月更文挑战第28天】监控和诊断MySQL数据库的性能问题是确保数据库高效稳定运行的关键
213 1
|
2月前
|
缓存 关系型数据库 MySQL
如何优化 MySQL 数据库的性能?
【10月更文挑战第28天】
136 1