Mysql 8.0 新特性测试

Role

MySQL8.0版本添加了role特性,role是一种逻辑概念是权限的集合,可以将一个或以上的权限赋予给role,再将role赋给user。Oracle,Postgresql和Mariadb中早已存在role这个特性。

create role role_test;

grant select,insert,delete,update on zhongwc.tab01 to role_test;

create user 'user1'@'%' identified by 'user1';

grant role_test to 'user1'@'%';

show grants for 'user1'@'%';

使用root用户撤销role中的某些权限

revoke delete,update on zhongwc.tab01 from role_test;

MySQL8.0加入了两张系统表来维护role特性

default_roles;

desc role_edges;

隐藏索引

隐藏索引的特性对于性能调试非常有用。在 8.0 中,索引可以被“隐藏”和“显示”。当一个索引隐藏时,它不会被查询优化器所使用。

也就是说,我们可以隐藏一个索引,然后观察对数据库的影响。如果数据库性能有所下降,就说明这个索引是有用的,于是将其“恢复显示”即可;如果数据库性能看不出变化,说明这个索引是多余的,可以删掉了。

ALTER TABLE t ALTER INDEX i INVISIBLE;

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

ALTER TABLE t ALTER INDEX i VISIBLE;

参数持久化

MySQL 的设置可以在运行时通过 SET GLOBAL 命令来更改,但是这种更改只会临时生效,到下次启动时数据库又会从配置文件中读取。

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

SET PERSIST max_connections = 500;

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

UTF8mb4为默认编码

With 语句(仿oracle)

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

 

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;

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

窗口函数(仿oracle)

MySQL 被吐槽最多的特性之一就是缺少 rank() 函数,当需要在查询当中实现排名时,必须手写 @ 变量。但是从 8.0 开始,MySQL 新增了一个叫窗口函数的概念,它可以用来实现若干新的查询方式。

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

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

 

mysql> select * from classes;

+--------+-----------+

| name | stu_count |

+--------+-----------+

| class1 |  41 |

| class2 |  43 |

| class3 |  57 |

| class4 |  57 |

| class5 |  37 |

+--------+-----------+

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 |  37 | 1 |

| class1 |  41 | 2 |

| class2 |  43 | 3 |

| class3 |  57 | 4 |

| class4 |  57 | 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 |  41 |   235 |

| class2 |  43 |   235 |

| class3 |  57 |   235 |

| class4 |  57 |   235 |

| class5 |  37 |   235 |

+--------+-----------+-------------+

5 rows in set (0.00 sec)

这样做有什么用呢?这样我们就可以一次性将每个班级的学生人数占比查出来了:

 

mysql> select *,

-> (stu_count)/(sum(stu_count) over()) as rate

-> from classes;

+--------+-----------+--------+

| name | stu_count | rate |

+--------+-----------+--------+

| class1 |  41 | 0.1745 |

| class2 |  43 | 0.1830 |

| class3 |  57 | 0.2426 |

| class4 |  57 | 0.2426 |

| class5 |  37 | 0.1574 |

+--------+-----------+--------+

5 rows in set (0.00 sec)

这在以前可是要写一大段晦涩难懂的语句才能做到的哦!关于窗口函数的更多介绍在这里

自适应内存参数innodb_dedicated_server=ON

适应场景

  • 运行MySQL的服务器上是专门给MySQL提供服务的。innodb_dedicated_server的默认设置都是假设这个服务器的资源,MySQL都能用起来。

不适应场景

  • 单机多实例情况下不适应。
  • 其他有特殊场景要求的不适用。比如:不是主要以InnoDB为存储引擎的;服务器上还有其他应用程序的等等。

可以设置参数 innodb_dedicated_server=ON来让MySQL自动探测服务器的内存资源,确定innodb_buffer_pool_size, innodb_log_file_size 和 innodb_flush_method 三个参数的取值。具体取值策略如下。

innodb_buffer_pool_size:

  • <1G: 128M(innodb_dedicated_server=为OFF时的默认取值)
  • <=4G: 探测到的物理内存 * 0.5
  • >4G: 探测到的物理内存 * 0.75

innodb_log_file_size:

  • <1G: 48M(innodb_dedicated_server=为OFF时的默认取值)
  • <=4G: 128M
  • <=8G: 512M
  • <=16G: 1024M
  • >16G: 2G

innodb_flush_method:

如果系统允许设置为O_DIRECT_NO_FSYNC。如果系统不允许,则设置为InnoDB默认的Flush method。

上述这些参数在MySQL每次启动时自动探测服务器(包括虚拟机和容器的内存)配置并自动生效。

自适应参数使用注意

  • innodb_dedicated_server默认设置为OFF,不会自适应调整3个参数值。该参数也不是动态参数,无法动态调整,也就是说MySQL启动后无法修改这个参数
  • innodb_dedicated_server=ON 设置以后它其实只探测了服务器内存,所以目前只能自适应调整内存相关的三个参数
  • innodb_dedicated_server=ON的情况下,如果还显式设置了 innodb_buffer_pool_size / innodb_log_file_size / innodb_flush_method 参数,显示设置的这些参数会优先生效,并且在MySQL的错误日志中会打印如下内容:
"[Warning] InnoDB: Option innodb_dedicated_server is ignored for because 'variable name'=? is specified explicitly."

'variable name' 指的就是 innodb_buffer_pool_size/innodb_log_file_size/inndob_flush_method参数。

注意:你不管是在配置文件、命令行、还是MySQL新引入的固化配置中设定上述三个参数都被认为是显式指定了参数值,都会优先生效。

  • 显示指定某一个值,并不会影响其他变量的自适应参数值设置。例如显式设置了innodb_buffer_pool_size,那么buffer pool会按照你显示设置的值初始化,而不是 innodb_dedicated_server参数对应的值。但是innodb_log_file_size 和 innodb_flush_method 并不会受影响,它们还是会按照innodb_dedicated_server的自适应值按照服务器的内存大小来设置。
  • innodb_dedicated_server=ON的情况下,mysqld服务进程每次重启后都会自动调整上述三个参数值。在任何时候MySQL都不会将自适应值保存在持久配置中。
  • 如果系统不支持O_DIRECT_NO_FSYNC,MySQL会沿用之前的默认值。MySQL仍然必须保证在所有平台上能正常启动,不需要任何其他更改。
  • 如果自适应导致innodb_log_file_size对应的redo log file超过了磁盘空间限制(这个空间得有多小!),将会采取以下措施:
  • 新生成的日志文件redo log将被删除
  • 错误日志显示如下
  1. "[ERROR] InnoDB: Error number 28 means 'No space left on device'
  2.  [ERROR] InnoDB: Cannot set log file to size MB"
* mysqld服务拒绝启动。
  • innodb_dedicated_server=ON并不见得是最优的配置。例如,你用了MyISAM,MyRocks等其他存储引擎时,建议手工调整,而不是设置innodb_dedicated_server=ON
  • XFS系统请手工设置inndob_flush_method=O_DIRECT。在inndob_flush_method=O_DIRECT_NO_FSYNC下,InnoDB使用O_DIRECT来刷新IO,但是跳过fsync()步骤。对某些文件系统有效,但是对XFS文件系统并不适用。为了保证文件的metadata刷新到磁盘中,XFS必须使用O_DIRECT。

取消默认MyISAM 引擎

由于采用了新的本地数据字典,现在我们不在需要MyISAM系统表了!

这些表和数据字典表现在都在一个名为mysql.idb的InNoDB表空间文件中。

这意味着如果你没有明确使用MyISAM表(为了你的数据,我们并不建议这样做),你可以创建一个没有任何MyISAM表的MySQL实例。

UNDO 空间回收

UNDO空间回收

在MySQL5.7中,我们已经可以截断UNDO空间了(设置innodb_undo_log_truncate,默认情况下禁用)。

在MySQL8中,我们改进了磁盘格式来使得每个UNDO表有大量的UNDO段。

此外,现在默认为两个单独的UNDO表空间(而非InnoDB系统表空间(最小为2,大小动态变化))中创建UNDO段。

我们不推荐使用innodb_undo_tablespaces来设置该值,因为我们将提供SQL命令让数据库管理员与UNDO表空间进行交互。

自动截断UNDO表空间默认启用。

取消Query Cache

我在性能审计中建议的第一件事就是禁用Query Cache,因为它给设计带来了很多麻烦。

MySQL QC造成的问题比它解决问题要多的多。因此我们决定在MySQL 8.0中取消它,因为大家就不应该使用它。

如果您的工作负载需要Query Cache,那么您应该改用ProxySQL替代Query Cache。

院子DDL

原子DDL

由于采用了新的数据字典,MySQL 8.0现在支持原子数据定义语句(原子DDL)。

这意味着当执行DDL时,数据字典更新,存储引擎操作以及二进制日志中的写入操作会合并到单个原子事务中,该事务要么完全执行,要么根本不执行。

这提高了DDL的稳定性保证未完成的DDL不会留下任何不完整的数据。

Mysql 8.0 新特性测试的更多相关文章

  1. MySQL 8.0 新特性梳理汇总

    一 历史版本发布回顾 从上图可以看出,基本遵循 5+3+3 模式 5---GA发布后,5年 就停止通用常规的更新了(功能不再更新了): 3---企业版的,+3年功能不再更新了: 3 ---完全停止更新 ...

  2. 干货 | 解读MySQL 8.0新特性:Skip Scan Range

    MySQL从8.0.13版本开始支持一种新的range scan方式,称为Loose Skip Scan.该特性由Facebook贡献.我们知道在之前的版本中,如果要使用到索引进行扫描,条件必须满足索 ...

  3. MySQL 8.0新特性之原子DDL

    文章来源:爱可生云数据库 简介 MySQL8.0 开始支持原⼦ DDL(atomic DDL),数据字典的更新,存储引擎操作,写⼆进制日志结合成了一个事务.在没有原⼦DDL之前,DROP TABLE ...

  4. Mysql 8.0 新特性

    转载:https://www.jianshu.com/p/be29467c2b0c

  5. 【mysql】mysq8.0新特性

    一.MySQL8.0简介   mysql8.0现在已经发布,2016-09-12第一个DM(development milestone)版本8.0.0发布.新的版本带来很多新功能和新特性,对性能也得到 ...

  6. Django 2.0 新特性 抢先看!

    一.Python兼容性 Django 2.0支持Python3.4.3.5和3.6.Django官方强烈推荐每个系列的最新版本. 最重要的是Django 2.0不再支持Python2! Django ...

  7. Java基础加强-(注解,动态代理,类加载器,servlet3.0新特性)

    1.   Annotation注解 1.1.  Annotation概述 Annotation是JDK 5.0以后提供对元数据的支持,可以在编译.加载和运行时被读取,并执行相应的处理.所谓Annota ...

  8. Visual Studio 2015速递(1)——C#6.0新特性怎么用

    系列文章 Visual Studio 2015速递(1)——C#6.0新特性怎么用 Visual Studio 2015速递(2)——提升效率和质量(VS2015核心竞争力) Visual Studi ...

  9. 返璞归真 asp.net mvc (13) - asp.net mvc 5.0 新特性

    [索引页][源码下载] 返璞归真 asp.net mvc (13) - asp.net mvc 5.0 新特性 作者:webabcd 介绍asp.net mvc 之 asp.net mvc 5.0 新 ...

随机推荐

  1. 《绘图前设置:像素格式——PIXELFORMATDESCRIPT、设备上下文、渲染上下文》

    转载地址:https://www.cnblogs.com/wiener-zyj/p/4159745.html  像素格式——PIXELFORMATDESCRIPT.设备上下文.渲染上下文 在OpenG ...

  2. Java“被迫”退出争霸,Python继续霸占首位!老牌程序员:我不服

    2019年转眼已经接近尾声,如果盘点下2019年最火的语言,除了Python还能有谁?你心中的王者语言又是谁? 这一年Python风光无限 这一年JAVA走向右边 这一年,我们都很感慨,你呢? 关于P ...

  3. instrrev 和instr 区别vb

    Private Sub Form_click() Dim temp As String temp = "c:\window\system" Print Mid(temp, InSt ...

  4. 结合webpack使用vue-router和它的子路由,即路由嵌套

    在上一个项目的基础上进行的,所以基本的配置在这里就不赘述了. 一.结合webpack使用vue-router 1.新建组件.vue文件 2.启用路由 安装插件cnpm i vue-router -S ...

  5. ubuntu16.04修改复制粘贴快捷键的方法

    打开终端-选择配置文件首选项 打开,选择快捷键,自行修改

  6. HTML入门归纳--JavaScript

    本人一直在从事.net的开发,界面都是采用的WPF,近期花了一个多月进行HTML前端的学习,在这里呢进行学习总结和归纳. 本系列将主要分为4个模块: 控件 样式 布局 JavaScript 根据多年W ...

  7. Django组件总结

    Django组件介绍 分页器的使用 分页器在页面中非常常见,当数据库条数数据过多时,页面一次性显示不好看时,我们可以使用分页器,将数据分几次显示. 1.1 数据库内插入大量数据 Booklist=[] ...

  8. vue入门基础知识点测试

    vue入门基础知识点测试 1.文本(值绑定){{var}}----控制<div></div>的值显示当前时间,且1秒更新一次.(可查阅 setinterval 函数,时间Dat ...

  9. 远程传输文件命令:scp

    1.概述 scp(secure copy)是一个基于 SSH 协议在网络之间进行安全传输的命令,其格式为“scp [参数] 本地文件 远程帐户@远程 IP 地址:远程目录”. 与第 2 章讲解的 cp ...

  10. Linux 文件属性 chgrp、chown、chmod的用法

    Linux 文件属性 ls 是 list 的意思,重点在显示文件的文件名与相关属性.选项 -al 表示列出所有的文件详细的权限与属性(包含隐藏文件,就是文件名第一个字符为 . 的文件) 第一栏代表这个 ...