MySQL 8.0有什么新功能

  https://mysqlserverteam.com/whats-new-in-mysql-8-0-generally-available/php

咱们自豪地宣布MySQL 8.0的通常可用性。 如今下载! MySQL 8.0是世界上最受欢迎的开源数据库中使人兴奋的新版本,而且全面改进。一些关键的加强功能包括:html

  1. SQL 窗口函数,公用表表达式,NOWAIT和SKIP LOCKED,降序索引,分组,正则表达式,字符集,成本模型和直方图。
  2. JSON 扩展语法,新功能,改进的排序和部分更新。使用JSON表函数,您能够将SQL机制用于JSON数据。
  3. GIS 地理支持。空间参考系统(SRS),以及SRS感知空间数据类型,空间索引和空间函数。
  4. 可靠性 DDL语句已成为原子和崩溃安全,元数据存储在单个事务数据字典中。由InnoDB提供支持!
  5. 可观察性 性能模式,信息模式,配置变量和错误记录的显着加强。
  6.  管理远程管理,撤消表空间管理和新的即时DDL。
  7. 安全性 OpenSSL改进,新的默认身份验证,SQL角色,分解超级权限,密码强度等。
  8. Performance InnoDB在读/写工做负载,IO绑定工做负载和高争用“热点”工做负载方面表现更佳。添加了资源组功能,经过将用户线程映射到CPU,为用户提供了针对特定硬件上的特定工做负载进行优化的选项。

上面描述了一些亮点,我鼓励你进一步深刻到完整的系列里程碑博客文章-8.0.0的 8.0.1 ,8.0.2 ,8.0.3,and8.0.4 -和甚至进一步降低到各个工做 日志 及其规格和实施细节。或者您可能只想查看github.com/mysql上的源代码 mysql

开发者功能

MySQL开发人员须要新功能,MySQL 8.0在SQL,JSON,正则表达式和GIS等领域提供了许多新的和备受欢迎的功能。开发人员也但愿可以存储Emojis,所以UTF8MB4如今是8.0中的默认字符集。最后,数据类型有了改进,对BINARY数据类型进行了逐位操做,并改进了IPv6和UUID函数。git

SQL

窗口功能github

MySQL 8.0提供SQL窗口功能。与分组聚合函数相似,窗口函数对一组行执行一些计算,例如COUNT 或 SUM 。可是,若是分组聚合将这组行折叠为单行,则窗口函数将对结果集中的每一行执行聚合。正则表达式

窗口函数有两种形式:用做窗口函数的SQL聚合函数和专用窗口函数。这是MySQL中支持窗口的一组聚合函数: COUNT , SUM , AVG , MIN , MAX , BIT_OR , BIT_AND , BIT_XOR ,STDDEV_POP (及其同义词 STD , STDDEV ), STDDEV_SAMP , VAR_POP (及其同义词 VARIANCE )和 VAR_SAMP 。一组专门的窗口函数是: RANK , DENSE_RANK , PERCENT_RANK , CUME_DIST ,NTILE , ROW_NUMBER , FIRST_VALUE , LAST_VALUE , NTH_VALUE , LEAD 和 LAG算法

对窗口函数(也称为分析函数)的支持是频繁的用户请求。窗口函数长期以来一直是标准SQL(SQL 2003)的一部分。请参阅Dag Wanvikhere的博客文章以及Guilhem Bichothere的博客文章。sql

公用表表达式数据库

MySQL 8.0提供[递归]公用表表达式(CTE)。非递归CTE能够解释为“改进的派生表”,由于它容许屡次引用派生表。递归CTE是一组迭代构建的行:从一组初始行开始,一个进程派生新行,这些行增加了这一组,并​​且这些新行再次被送入进程,产生更多行,依此类推,直到该过程再也不产生行。CTE是经常使用的SQL功能,请参阅功能请求 16244 和 32174 。查看Guilhem Bichothere的博客文章, 这里 ,这里,和其余地方。express

NOWAIT和SKIP LOCKED

MySQL的8.0提供了 NOWAIT 与 SKIP LOCKED 该SQL锁定子句中的替代品。一般,当一行因a UPDATE 或a 而被锁定时 SELECT ... FOR UPDATE ,任何其余事务都必须等待访问该锁定行。在某些用例中,若是行被锁定或忽略锁定的行,则须要当即返回。使用的锁定子句 NOWAIT 永远不会等待获取行锁。相反,查询将失败并显示错误。使用的锁定子句 SKIP LOCKED 永远不会等待获取列出的表上的行锁。而是跳过锁定的行,根本不读取。NOWAIT和SKIP LOCKED常常被要求SQL功能。请参阅功能请求 49763 。咱们还要感谢 Kyle Oppenheim  为他的代码贡献!请参阅Martin Hanssonhere的博客文章。

降序索引

MySQL 8.0按降序提供对索引的支持。这种索引中的值按降序排列,咱们向前扫描。在8.0以前,当用户建立降序索引时,咱们建立了一个升序索引并向后扫描它。一个好处是前向索引扫描比后向索引扫描更快。真正的降序索引的另外一个好处是它使咱们可以使用索引而不是filesort来处理ORDER BY 具备混合ASC/DESC 排序键部分的 子句 。 降序索引 是一种常常请求的SQL功能。参见例如特征请求 13375 。请参阅Chaithra Gopalareddy的博客文章。

GROUPING

MySQL 8.0提供 GROUPING() , SQL_FEATURE T433 。该 GROUPING() 函数将超级聚合行与常规分组行区分开来。 GROUP BY 扩展,例如 ROLLUP 生成超级聚合行,其中全部值的集合由null表示。使用该 GROUPING() 函数,您能够区分表示超级聚合行中全部值的集合的空值与 NULL 常规行中的值。GROUPING是一种常常请求的SQL功能。请参阅功能请求 3156 和 46053 。感谢 Zoe Dong 和 Shane Adams 在功能请求46053中的代码贡献 请参阅Chaithra Gopalareddy的博客文章。

优化器提示

在5.7中,咱们为优化器提示引入了一个新的提示语法 使用新语法,能够SELECT | INSERT | REPLACE | UPDATE | DELETE 在SQL语句中关键字以后直接指定提示,这些 关键字包含在 /*+ */ 样式注释中。(见Sergey Glukhovhere的5.7篇博文)。在MySQL 8.0中,咱们经过充分利用这种新风格来完成图片:

  • MySQL 8.0为INDEX_MERGE 和 添加了提示 NO_INDEX_MERGE 。这容许用户在不更改优化器开关的状况下控制单个查询的索引合并行为。
  • MySQL的8.0增长了用于提示 JOIN_FIXED_ORDER , JOIN_ORDER , JOIN_PREFIX ,和JOIN_SUFFIX 。这容许用户控制链接执行的表顺序。
  • MySQL 8.0添加了一个名为的提示 SET_VAR 。该 SET_VAR 提示将针对只剩下一语句给定的系统变量设置的值。所以,在语句结束后,该值将重置为以前的值。请参阅Sergey Glukhovhere的博客文章。

咱们更喜欢新格式的优化器提示,而不是旧式提示和 值设置 经过不与SQL混合,能够在查询字符串中的许多位置注入新提示。它们在提示(vs指令)时也有更清晰的语义。optimizer_switch

JSON

MySQL 8.0添加了新的JSON函数,并提升了对JSON值进行排序和分组的性能​​。

JSON路径表达式中范围的扩展语法

MySQL 8.0扩展了JSON路径表达式中范围的语法。例如 SELECT JSON_EXTRACT('[1, 2, 3, 4, 5]', '$[1 to 3]'); 结果 [2, 3, 4] 。引入的新语法是SQL标准语法的一个子集,在SQL:2016,9.39中描述了SQL / JSON路径语言:语法和语义。另见 Roland Bouman报道的Bug#79052

JSON表函数

MySQL 8.0添加了JSON表函数,可使用SQL机制来处理JSON数据。 JSON_TABLE() 建立JSON数据的关系视图。它将JSON数据评估的结果映射到关系行和列。用户可使用SQL查询函数返回的结果做为常规关系表,例如join,project和aggregate。

JSON聚合函数

MySQL 8.0添加了聚合函数 JSON_ARRAYAGG() 来生成JSON数组并 JSON_OBJECTAGG() 生成JSON对象。这使得能够将多行中的JSON文档组合成JSON数组或JSON对象。请参阅Catalin Besleagahere的博客文章。

JSON合并函数

该 JSON_MERGE_PATCH() 函数实现了RFC7396指定的JavaScript(和其余脚本语言)的 语义 ,即它经过第二个文档的优先级删除重复项。例如, 。 JSON_MERGE('{"a":1,"b":2 }','{"a":3,"c":4 }'); # returns {"a":3,"b":2,"c":4}

该 JSON_MERGE_PRESERVE() 函数具备在MySQL 5.7中实现的JSON_MERGE()的语义,例如,它保留全部值  JSON_MERGE('{"a": 1,"b":2}','{"a":3,"c":4}'); # returns {"a":[1,3],"b":2,"c":4}.

JSON_MERGE() MySQL 8.0中不推荐使用 现有 函数来消除合并操做的歧义。另见Bug#81283中的提案 和Morgan Tockerhere的博客文章。

JSON漂亮功能

MySQL 8.0 JSON_PRETTY() 在MySQL中添加了一个 函数。该函数接受JSON本机数据类型或JSON的字符串表示形式,并以人类可读的方式返回JSON格式的字符串,并带有新行和缩进。

JSON大小函数

MySQL 8.0添加了与给定JSON对象的空间使用相关的JSON函数。该 JSON_STORAGE_SIZE() 回报的JSON数据类型字节的实际大小。在 JSON_STORAGE_FREE() 返回以字节为单位,包括分段和填充保存就地更新一个JSON二进制类型的自由空间。

JSON改进了排序

MySQL 8.0经过使用可变长度排序键为JSON值排序/分组提供了更好的性能。初步基准测试代表,根据使用状况,分类改进了1.2到18倍。

JSON部分更新

MySQL的8.0增长了对部分更新支持 JSON_REMOVE() , JSON_SET() 以及 JSON_REPLACE() 功能。若是只更新JSON文档的某些部分,咱们但愿向处理程序提供有关更改内容的信息,以便存储引擎和复制不须要编写完整文档。在复制环境中,没法保证JSON文档的布局在从属和主服务器上的布局彻底相同,所以物理差别不能用于减小基于行的复制的网络I / O. 所以,MySQL 8.0提供了逻辑差别,基于行的复制能够经过线路发送并在从属设备上从新应用。请参阅Knut Anders Hatlenhere的博客文章。

GIS

MySQL 8.0提供地理支持。这包括空间参考系统(SRS)的元数据支持,以及SRS感知空间数据类型,空间索引和空间函数。简而言之,MySQL 8.0能够理解地球表面的纬度和经度坐标,例如,能够在大约5000个支持的空间参考系统中的任何一个中正确计算地球表面上两点之间的距离。

空间参考系统(SRS)

的 ST_SPATIAL_REFERENCE_SYSTEMS 信息模式视图提供有关空间数据可用的空间参考系统的信息。该视图基于SQL / MM(ISO / IEC 13249-3)标准。每一个空间参考系统由SRID号标识。MySQL 8.0附带了来自EPSG大地测量参数数据集的大约5000个SRID ,包括地理参考椭球和2d投影(即全部2D空间参考系统)。

SRID感知空间数据类型

空间数据类型可使用空间参考系统定义来归因,例如SRID 4326,以下所示: CREATE TABLE t1 (g GEOMETRY SRID 4326); SRID在这里是GEOMETRY数据类型的SQL类型修饰符。插入具备SRID属性的列的值必须位于该SRID中。尝试将值与其余SRID一块儿插入会致使引起异常状况。未修改的类型(即没有SRID规范的类型)将继续像之前同样接受全部SRID。

MySQL 8.0添加了INFORMATION_SCHEMA.ST_GEOMETRY_COLUMNS SQL / MM第3部分Sect中指定视图。19.2。这种观点将列出全部几何列在MySQL实例,并为每列将列出标准 SRS_NAME ,SRS_ID 和 GEOMETRY_TYPE_NAME 。

SRID感知空间索引

能够在空间数据类型上建立空间索引。空间索引中的列必须声明为NOT NULL。例如这样:CREATE TABLE t1 (g GEOMETRY SRID 4326 NOT NULL, SPATIAL INDEX(g));

具备空间索引的列应具备SRID类型修饰符,以容许优化程序使用索引。若是在没有SRID类型修饰符的列上建立空间索引,则会发出警告。

SRID感知空间功能

MySQL 8.0扩展了空间函数,例如 ST_Distance() 和 ST_Length() 检测其参数是否在地理(椭圆体)SRS中并计算椭球上的距离。到目前为止, ST_Distance 和空间关系,例如 ST_Within, ST_Intersects , ST_Contains , ST_Crosses ,等支持地理计算。每一个ST函数的行为如SQL / MM第3部分Spatial中所定义。

字符集

MySQL 8.0使 UTF8MB4 成为默认字符集。SQL性能 - 例如排序UTF8MB4字符串 - 与5.7相比,在8.0中提升了20倍。UTF8MB4是网络的主要字符编码,这一举措将使绝大多数MySQL用户的生活更轻松。

  • 默认字符集已更改成 latin1 , utf8mb4 而且默认排序规则已更改 latin1_swedish_ci 为utf8mb4_800_ci_ai 。
  • 默认值的更改适用于libmysql和服务器命令工具以及服务器自己。
  • 这些更改也反映在MTR测试中,使用新的默认字符集运行。
  • 整理权重和案例映射基于 Unicode委员会于2016年6月21日宣布的Unicode 9.0.0
  • 可用于latin1(MySQL遗留)的21种语言特定的不区分大小写的排序规则已用于  utf8mb4 排序规则,例如捷克排序规则变为utf8mb4_cs_800_ai_ci。请参阅WL#9108中的完整列表 查看Xing Zhanghere的博客文章。
  • 添加了对大小写和重音敏感排序规则的支持。MySQL 8.0支持由DUCET(默认Unicode归类条目表)定义的全部3级归类权重。查看Xing Zhanghere的博客文章。
  • 日语 utf8mb4_ja_0900_as_cs 整理,utf8mb4 使用三个级别的权重字符进行 排序。这为日语提供了正确的排序顺序。查看Xing Zhanghere的博客文章。
  • 日语具备额外的假名敏感功能, utf8mb4_ja_0900_as_cs_ks 其中'ks'表明'假名敏感'。查看Xing Zhanghere的博客文章。
  • 将全部新的排序规则从Unicode 9.0.0向前更改成, NO PAD 而不是 PAD STRING 像对任何其余字符同样处理字符串末尾的空格。这样作是为了提升一致性和性能。旧的整理留在原地。

另请参阅Bernt Marius Johnsenhere撰写的博客文章。

数据类型

二进制数据类型的逐位操做

MySQL 8.0扩展了逐位操做('按位AND'等)也可使用 [VAR]BINARY/[TINY|MEDIUM|LONG]BLOB在8.0位以前,只支持整数操做。若是对二进制文件使用逐BIGINT 位操做,则在操做以前将参数隐式转换为 (64位),所以可能丢失位。从8.0开始,逐位运算对全部 数据类型BINARY 和BLOB数据类型都起做用, 从而使得参数不会丢失。

IPV6操纵

MySQL 8.0经过支持BINARY数据类型的逐位操做,提升了IPv6操做的可用性。在MySQL 5.6咱们介绍了 INET6_ATON() 和 INET6_NTOA() 其将文本形式等之间的IPv6地址的功能'fe80::226:b9ff:fe77:eb17' 和 VARBINARY(16) 。可是,到目前为止,咱们没法将这些IPv6功能与逐位操做结合起来,由于这样的操做会错误地将输出转换为 BIGINT 。例如,若是咱们有一个IPv6地址并但愿针对网络掩码进行测试,咱们如今可使用 

INET6_ATON(地址
 &INET6_ATON(网络

由于 INET6_ATON() 正确返回 VARBINARY(16) 数据类型(128位)。请参阅Catalin Besleagahere的博客文章。

 

UUID操纵

MySQL的8.0经过实现三个新的SQL函数提升UUID操做的易用性: UUID_TO_BIN() ,BIN_TO_UUID() ,和 IS_UUID() 。第一个从UUID格式的文本转换为 VARBINARY(16) ,第二个从VARBINARY(16) UUID格式的文本转换,最后一个检查UUID格式的文本的有效性。存储为a的UUID VARBINARY(16) 可使用功能索引进行索引。这些函数 UUID_TO_BIN() 也 UUID_TO_BIN()能够随机抽取时间相关的位并在开始时将它们移动,使其索引友好并避免B树中的随机插入,这样能够减小插入时间。已经提到缺乏这种功能 是使用UUID的缺点之一 。请参阅Catalin Besleagahere的博客文章。

成本模型

查询优化器将数据缓冲考虑在内

MySQL 8.0根据有关数据是驻留在内存仍是磁盘上的知识选择查询计划。这是自动发生的,从最终用户看,没有涉及配置。从历史上看,MySQL成本模型假设数据驻留在旋转磁盘上。与在内存中和磁盘上查找数据相关联的成本常数如今是不一样的,所以,优化器将基于对数据位置的了解为这两种状况选择更优化的访问方法。请参阅ØysteinGrøvlenhere的博客文章。

优化器直方图

MySQL 8.0实现了直方图统计。使用直方图,用户能够建立表中列的数据分布统计信息,一般用于非索引列,而后查询优化器将使用它来查找最佳查询计划。直方图统计的主要用例是计算“COLUMN operator CONSTANT”形式的谓词的选择性(过滤效果)。

用户经过ANALYZE TABLE 语法建立直方图,该 语法已被扩展为接受两个新子句: UPDATE HISTOGRAM ON column [, column] [WITH n BUCKETS] 和 DROP HISTOGRAM ON column [, column]存储桶的数量是可选的,默认值为100.直方图统计数据存储在字典表“column_statistics”中,可经过视图访问 information_schema.COLUMN_STATISTICS 。因为JSON数据类型的灵活性,直方图存储为JSON对象。 ANALYZE TABLE 将根据表大小自动决定是否对基表进行采样。它还将 根据数据分布和指定的桶数决定是构建 单例 仍是 等高直方图。请参阅ErikFrøsethhere的博客文章。

经常使用表达

MySQL的8.0支持UTF8MB4正则表达式,以及像新的功能 REGEXP_INSTR() , REGEXP_LIKE(), REGEXP_REPLACE() ,和 REGEXP_SUBSTR() 。添加了系统变量 regexp_stack_limit (默认为32步)和 regexp_time_limit (默认 8000000 字节)以控制执行。该 REGEXP_REPLACE() 功能是MySQL社区最须要的功能之一,例如,请参阅 Hans Ginzel 报告为BUG#27389功能请求 另见Martin Hanssonhere和Bernt Marius Johnsenhere的博客文章。

Dev Ops功能

Dev Ops关注数据库的操做方面,一般涉及可靠性,可用性,性能,安全性,可观察性和可管理性。高可用性随MySQL InnoDB Cluster和MySQL Group Replication一块儿提供,这将由一篇单独的博客文章介绍。如下是8.0对其余类别的表格所带来的内容。

可靠性

MySQL 8.0提升了MySQL的总体可靠性,由于:

  1. MySQL 8.0将其元数据存储到InnoDB中,这是一个通过验证的事务存储引擎。系统表(如用户和权限以及数据字典表)如今位于InnoDB中。
  2. MySQL 8.0消除了潜在不一致的一个来源。在5.7及更早版本中,基本上有两个数据字典,一个用于服务器层,另外一个用于InnoDB层,这些字典在某些崩溃状况下可能不一样步。在8.0中只有一个数据字典。
  3. MySQL 8.0确保原子,崩溃安全的DDL。有了这个,用户能够保证任何DDL语句均可以彻底执行或根本不执行。这在复制环境中尤为重要,不然可能存在主设备和从设备(节点)不一样步,致使数据漂移的状况。

这项工做是在新的事务数据字典的上下文中完成的。查看Staale Deraashere andhere的博客文章。

观测

信息架构(加速)

MySQL 8.0从新实现信息架构。在新实现中,信息模式表是存储在InnoDB中的数据字典表的简单视图。这比旧的实现效率更高,速度提升了100倍。这使得信息模式实际上能够经过外部工具使用。查看Gopal Shankarhere andhere的博客文章和StåleDeraashere的博客文章。

性能架构(加速)

MySQL 8.0经过在性能模式表上添加100多个索引来加速性能模式查询。性能模式表的索引是预约义的。它们不能被删除,添加或更改。性能模式索引实现为跨现有表数据的过滤扫描,而不是经过单独数据结构的遍历。没有要构建,更新或以其余方式管理的B树或哈希表。性能模式表索引的行为相似于散列索引,其中a)它们快速检索所需的行,b)不提供行排序,让服务器在必要时对结果集进行排序。可是,根据查询,索引会消除对全表扫描的须要,并返回至关小的结果集。性能模式索引是可见的 SHOW INDEXES 并在 EXPLAIN 输出中表示引用索引列的查询。来自Simon Mudd的评论。请参阅Marc Alffhere的博客文章。

配置变量

MySQL 8.0添加了有关配置变量的有用信息,例如变量名称, 最小值/最大值 , 当前值来自何处,   进行了更改以及什么时候进行更改 此信息位于名为的新性能模式表中  variables_info 。请参阅Satish Bharathyhere的博客文章。

客户端错误报告 - 消息计数

MySQL 8.0能够查看 服务器报告的客户端错误消息的聚合计数 用户能够查看来自5个不一样表的统计信息:全局计数,每一个线程的摘要,每一个用户的摘要,每一个主机的摘要或每一个账户的摘要。对于每一个错误消息,用户能够看到引起的错误数,SQL异常处理程序处理的错误数,“第一次看到”时间戳和“上次看到”时间戳。给定权限,用户能够 SELECT 从这些表 TRUNCATE 中重置统计信息。请参阅Mayank Prasadhere的博客文章。

声明延迟直方图

MySQL 8.0提供语句延迟的性能模式直方图,以便更好地查看查询响应时间。这项工做还从收集的直方图计算“P95”,“P99”和“P999”百分位数。这些百分位数可用做服务质量的指标。见弗雷德里克DESCAMPS博客文章 在这里 。

数据锁定依赖关系图

MySQL 8.0仪器数据锁定在性能模式中。当事务A锁定行R,而且事务B在同一行上等待时,B被A有效阻止。添加的检测暴露哪些数据被锁定(R),谁拥有锁(A),谁在等待对于数据(B)。见弗雷德里克DESCAMPS博客文章 在这里 。

摘要查询示例

MySQL 8.0对events_statements_summary_by_digest 性能模式表进行了一些更改, 以捕获完整的示例查询以及有关此查询示例的一些关键信息。QUERY_SAMPLE_TEXT 添加该列 以捕获查询示例,以便用户能够在实际查询上运行EXPLAIN并获取查询计划。QUERY_SAMPLE_SEEN 添加该列 以捕获查询示例时间戳。QUERY_SAMPLE_TIMER_WAIT 添加该列 以捕获查询示例执行时间。FIRST_SEEN 和 LAST_SEEN 已被修改成使用小数秒。见弗雷德里克DESCAMPS博客文章  在这里

关于仪器的元数据

MySQL 8.0将性能 , 易变性 和 文档等元数据添加 到性能模式表  setup_instruments中 。这种只读元数据充当仪器的在线文档,供用户或工具查看。见弗雷德里克DESCAMPS博客文章 在这里 。

错误记录

MySQL 8.0对MySQL 错误日志进行了重大改进 从软件体系结构的角度来看,错误日志是新服务基础结构中的一个组件。这意味着高级用户能够根据须要编写本身的错误日志实现。大多数用户不但愿编写本身的错误日志实现,但仍但愿在编写内容和编写内容时有必定的灵活性。所以,8.0为用户提供了添加 接收器(在哪里) 和 过滤器(什么)的功能 。MySQL 8.0实现了过滤服务(API)和默认过滤服务实现(组件)。此处的过滤意味着禁止给定日志消息(投影)中的某些日志消息(选择)和/或字段。MySQL 8.0实现了日志编写器服务(API)和默认的日志编写器服务实现(组件)。日志编写器接受日志事件并将其写入日志。此日志能够是经典文件,syslog,EventLog和新的JSON日志编写器。

默认状况下,在没有任何配置的状况下,MySQL 8.0提供了许多开箱即用的错误日志改进,例如:

  • 错误编号: 格式是10000系列中以“MY-”开头的数字,例如“MY-10001”。错误编号在GA版本中将保持稳定,但容许在维护版本中更改(即改进)相应的错误文本。
  • 系统消息: 系统消息做为[系统]而不是[错误],[警告],[注意]写入错误日志。不管详细程度如何,都会打印[系统]和[错误]消息,没法抑制。[系统]消息仅在少数地方使用,主要与主要状态转换相关,例如启动或中止服务器。
  • 减小详细程度:log_error_verbosity 的缺省值 从3(注释)更改成2(警告)。这使MySQL 8.0错误日志默认状况下更简洁。
  • 源组件: 每条消息都注释三个值[Server],[InnoDB],[Replic]中的一个,显示消息来自哪一个子系统。

这是在启动后写入8.0 GA中的错误日志的内容:

2018-03-08T101429.289863 ž 0 [系统] [MY- 010116 ] [服务器] / usr / sbin目录/ mysqld的(mysqld的8.05)开始做为过程8063 2018 -03-08T101429.745356 ž 0 [警告] [ MY-010068 ] [服务器] CA证书ca.pem是自签名的。 2018 -03-08T101429.765159 Z 0 [系统] [ MY-010931 ] [服务器] / usr / sbin / mysqld:准备链接。版本'8.0.5'   套接字'/ tmp / mysql.sock'   端口3306   源分发。 2018 -03-08T101651.343979 ž 0 [系统] [MY- 010910 ] [服务器] / usr / sbin目录/ mysqld的:关机完成(mysqld的8.05)来源的分布。 

在错误日志中引入错误编号容许MySQL在即将到来的维护版本(若是须要)中改进错误文本,同时保持错误编号(ID)不变。错误号也可做为过滤/抑制和国际化/本地化的基础。

可管理性

不可见的索引

MySQL 8.0增长了切换索引可见性(可见/不可见)的功能。优化程序在进行查询执行计划时不会考虑不可见索引。可是,索引仍然保留在后台,所以再次显示它很便宜。这样作的目的是让DBA / DevOp肯定是否能够删除索引。若是您怀疑某个索引未被使用,则首先使其不可见,而后监视查询性能,最后在没有遇到查询减慢的状况下删除索引。许多用户已经要求使用此功能,例如经过 Bug#70299 。请参阅Martin Hanssonhere的博客文章。

灵活撤销表空间管理

MySQL 8.0使用户能够彻底控制撤消表空间,即有 多少 表空间, 它们放在哪里,以及 每一个表空间 有 多少个回滚段

  1. 再也不在系统表空间中撤消登陆。 在升级期间,撤消日志将从System表空间迁移到Undo表空间。这为使用系统表空间的撤消日志提供了现有5.7安装的升级路径。
  2. 撤消表空间能够与System表空间分开管理。 例如,撤消表空间能够放在快速存储上。
  3. 回收很是大的交易所占用的空间(在线)。 至少建立两个Undo表空间以容许表空间截断。这容许InnoDB缩小撤消表空间,由于一个撤消表空间能够是活动的而另外一个是截断的。
  4. 更多回滚段能够减小争用。 用户可能选择最多127个撤消表空间,每一个表空间最多包含128个回滚段。更多回滚段意味着并发事务更有可能为其撤消日志使用单独的回滚段,从而减小对相同资源的争用。

请参阅Kevin Lewishere的博客文章。

全局变量的SET PERSIST

MySQL 8.0能够持久保存全局动态服务器变量。许多服务器变量都是GLOBAL和DYNAMIC,能够在服务器运行时从新配置。例如: SET GLOBAL sql_mode='STRICT_TRANS_TABLES'; 可是,从新启动服务器时会丢失此类设置。

这项工做使得编写成为可能 SET PERSIST sql_mode='STRICT_TRANS_TABLES'; 。效果是设置将在服务器重启后继续存在。此功能有许多使用方案,但最重要的是,它提供了一种在编辑配置文件时管理服务器设置的方法不方便或不是一个选项。例如,在某些托管环境中,您没有文件系统访问权限,您拥有的只是链接到一个或多个服务器的能力。至于 SET GLOBAL 你须要超级特权 SET PERSIST 。

还有 RESET PERSIST 命令。该 RESET PERSIST 命令具备从persist配置中删除配置变量的语义,从而将其转换为具备相似的行为 SET GLOBAL 。

MySQL 8.0容许 SET PERSIST 设置大多数只读变量,新值将在下次服务器重启时生效。请注意,有意没法设置一小部分只读变量。请参阅Satish Bharathyhere的博客文章。

远程管理

MySQL 8.0实现了一个SQL RESTART命令。目的是经过SQL链接启用MySQL服务器的远程管理,例如经过SET PERSIST 后跟a 来设置非动态配置变量 RESTART 。请参阅博客文章  MySQL 8.0:轻松更改配置和云友好! 做者FrédéricDescamps。

重命名表空间(SQL DDL)

MySQL 8.0实现 ALTER TABLESPACE s1 RENAME TO s2; 共享/通用表空间是用户可见的实体,用户可使用CREATE,ALTER和DROP。另请参阅 Bug#26949 , Bug#32497 和 Bug#58006

重命名列(SQL DDL)

MySQL 8.0实现 ALTER TABLE ... RENAME COLUMN old_name TO new_name; 这是对现有语法ALTER TABLE <table_name> CHANGE ...的改进,它须要从新指定列的全部属性。旧/现有语法的缺点是,尝试进行重命名的应用程序可能没法使用全部列信息。旧/现有语法中存在乎外数据类型更改的风险,这可能致使数据丢失。

安全功能

新的默认身份验证插件

MySQL 8.0将默认的身份验证插件从 mysql_native_password更改 为caching_sha2_password 。相应地,libmysqlclient也将使用caching_sha2_password做为默认的身份验证机制。新的caching_sha2_password结合了更好的安全性(SHA2算法)和高性能(缓存)。整体方向是咱们建议全部用户使用TLS / SSL进行全部网络通讯。请参阅Harin Vadodariahere的博客文章。

社区版中的默认OpenSSL

MySQL 8.0统一在 OpenSSL上 做为MySQL企业版和MySQL社区版的默认TLS / SSL库。之前,MySQL Community Edition使用 YaSSL 。在MySQL社区版中支持OpenSSL一直是最常请求的功能之一。请参阅FrédéricDescampshere的博客文章。

OpenSSL是动态连接的

MySQL 8.0与OpenSSL动态连接。从 MySQL Repository 用户的角度来看,MySQL软件包依赖于Linux系统提供的OpenSSL文件。经过动态连接,能够在可用时应用OpenSSL更新,而无需MySQL升级或修补程序。请参阅FrédéricDescampshere的博客文章。

撤消和重作日志的加密

MySQL 8.0实现UNDO和REDO日志的数据静态加密。在5.7中,咱们 为存储在每一个表文件表空间中的InnoDB表引入了 表空间加密此功能为物理表空间数据文件提供静态加密。在8.0中,咱们将其扩展为包括UNDO和REDO日志。见文档 这里 。

SQL角色

MySQL 8.0实现了SQL角色。角色是命名的特权集合。目的是简化用户访问权限管理。能够向用户授予角色,为角色授予权限,建立角色,删除角色以及肯定在会话期间适用的角色。见弗雷德里克DESCAMPS博客文章 在这里 。

容许PUBLIC的受权和撤销

MySQL 8.0引入了配置变量 ,可用于 在建立新用户时自动分配和授予 默认角色示例: 始终将全部指定的角色视为已授予每一个用户,而且没法撤消这些角色。除非将这些角色设为默认角色,不然这些角色仍须要激活。当新服务器配置变量 设置为“ON”时,在用户进行身份验证后,始终会激活全部授予的角色。 mandatory-roles role1@%,role2,role3,role4@localhostactivate-all-roles-on-login

打破超级特权

MySQL 8.0为之前版本中SUPER的各个方面定义了一组新的细化权限。目的是限制用户对手头工做所需内容的访问权限,仅此而已。例如 BINLOG_ADMIN , CONNECTION_ADMIN 和ROLE_ADMIN 。

管理XA事务的受权模型

MySQL 8.0引入了一个新的系统特权 XA_RECOVER_ADMIN ,它控制着执行语句的能力 XA RECOVER 。XA RECOVER 未被授予新系统特权的用户尝试执行 此操做 XA_RECOVER_ADMIN 将致使错误。

密码轮换政策

MySQL 8.0引入了对密码重用的限制。能够在全局级别以及单个用户级别配置限制。密码历史记录保持安全,由于它能够提供有关我的用户更改密码时使用的习惯或模式的线索。该 密码轮换政策 来除了其余现有机制,如 密码过时策略 和 容许的密码策略 。请参阅 密码管理 。

减慢对用户密码的暴力攻击

MySQL 8.0基于连续不成功的登陆尝试在认证过程当中引入了延迟。目的是减缓对用户密码的暴力攻击。能够在引入延迟以前配置连续不成功尝试的次数以及引入的最大延迟量。

退出skip-grant-tables

启动服务器时,MySQL 8.0不容许远程链接 –skip-grant-tables 。另见 Omar Bourja报告的Bug# 79027。

将mysqld_safe功能添加到服务器

MySQL 8.0实现了当前在mysqld_safe 服务器内部脚本中找到的逻辑部分 在某些状况下,这项工做能够提升服务器的可用性,例如在使用 --daemonize 启动选项时。这项工做也使用户减小对mysqld_safe script 咱们的依赖 ,咱们但愿未来能够删除。它还修复 了Peter Laursen报道的Bug#75343

性能

MySQL 8.0具备更好的读/写工做负载,IO绑定工做负载和高争用“热点”工做负载的性能。此外,新的资源组功能经过将用户线程映射到CPU,为用户提供了针对特定硬件上的特定工做负载进行优化的选项。

扩展读/写工做量

MySQL 8.0能够很好地扩展RW和繁重的写入工做负载。在密集的RW工做负载上,咱们观察到4个并发用户已经得到了更好的性能,而且与MySQL 5.7相比,在高负载上性能提升了2倍以上。咱们能够说,虽然5.7显着提升了只读工做负载的可扩展性,但8.0显着提升了读/写工做负载的可扩展性。结果是MySQL提升了标准服务器端硬件(如带有2个CPU插槽的系统)的硬件利用率(效率)。这种改进是因为从新设计InnoDB如何写入REDO日志。与用户线程不断争取记录其数据更改的历史实现相反,在新的REDO日志解决方案中,用户线程如今是无锁的,REDO写入和刷新由专用后台线程管理,整个REDO处理变为事件驱动。请参阅Dimitri Kravtchuk的博客文章 在这里 。

利用IO容量(快速存储)

MySQL 8.0容许用户充分利用每一个存储设备。例如,使用Intel Optane闪存设备进行测试,咱们可以在彻底IO绑定的工做负载中超过1M Point-Select QPS。(IO绑定意味着数据不缓存在缓冲池中,但必须从辅助存储中检索)。这种改进是因为摆脱了   fil_system_mutex  全球锁定。

高争用负载时的更好性能(“热行”)

MySQL 8.0显着提升了高争用工做负载的性能。当多个事务正在等待表中同一行的锁定时,会发生高争用工做负载,从而致使等待事务的队列。许多现实世界的工做负载不是平稳的,例如一天,但可能在某些时间爆发( 帕累托分布 )。MySQL 8.0在每秒事务数,平均延迟和第95百分位延迟方面都能更好地处理此类突发事件。最终用户的好处是更好的硬件利用率(效率),由于系统须要更少的备用容量,所以能够以更高的平均负载运行。最初的补丁由Jiamin Huang( Bug#84266 )提供。请研究一下 争用意识事务调度 (CATS)算法,阅读贾民明和Sunny Bainshere的MySQL博客文章。

资源组

MySQL 8.0将全局资源组引入MySQL。使用资源组,DevOps / DBA能够管理用户/系统线程和CPU之间的映射。这可用于在CPU之间拆分工做负载,以在某些用例中得到更高的效率和/或性能。所以,资源组向DBA工具箱添加了一个工具,该工具能够帮助DBA提升硬件利用率或提升查询稳定性。例如,在Intel(R)Xeon(R)CPU E7-4860 2.27 GHz 40内核-HT盒上运行Sysbench RW工做负载时,咱们经过将写入负载限制为10个内核,使总吞吐量翻了一番。资源组是一种至关先进的工具,须要有效使用熟练的DevOps / DBA,由于效果会随着负载类型和手头的硬件而变化。

其余特性

更好的默认值

在MySQL团队中,咱们密切关注MySQL的默认配置,并旨在让用户尽量得到最佳的开箱即用体验。MySQL 8.0已将超过30个默认值更改成咱们认为更好的值。请参阅MySQL 8.0中的博客文章 New Defaults 。Mogan Tockerhere在博客文章中概述了这一动机。

协议

MySQL 8.0添加了一个关闭结果集的元数据生成和传输的选项。构造/解析和发送/接收结果集元数据消耗服务器,客户端和网络资源。在某些状况下,元数据大小可能比实际结果数据大小大得多,而且不须要元数据。经过彻底禁用这些数据的生成和存储,咱们能够显着加快查询结果传输速度。CLIENT_OPTIONAL_RESULTSET_METADATA 若是客户端不但愿元数据返回结果集,则客户端能够设置该 标志。

C客户端API

MySQL 8.0扩展了libmysql的C API,其中包含一个稳定的接口,用于从服务器获取做为数据包流的复制事件。目的是避免调用未记录的API和打包内部头文件,以实现基于binlog的程序,如MySQL Applier for Hadoop。

Memcached的

MySQL 8.0经过多个get 操做和范围查询支持 加强了InnoDB Memcached功能 咱们添加了对多重获取 操做的支持, 以进一步提升读取性能,即用户能够在单个memcached查询中获取多个键值对。 Yoshinori @ Facebook已经要求支持 范围查询使用范围查询,用户能够指定特定范围,并获取此范围内的全部限定值。这两个功能均可以显着减小客户端和服务器之间的往返次数。

持久性自动计数器

MySQL 8.0 AUTOINC 经过计数器写入重作日志来保留 计数器。这是对旧版Bug#199的修复MySQL恢复过程将重播重作日志并确保AUTOINC 计数器的正确值 不会有任何AUTOINC 计数器回滚 这意味着数据库恢复将在崩溃后从新创建最后的已知计数器值。它保证 AUTOINC 计数器不能两次得到相同的值。计数器单调递增,但请注意可能存在间隙(未使用的值)。缺少持久性AUTOINC 在过去被认为是麻烦的,例如参见 Stephen Dewey在2006年报道的Bug#21641或 这篇 博文。

摘要

如上所示,MySQL 8.0带有大量新功能和性能改进。dev.mysql.com下载 并试用!

您还能够  现有的MySQL 5.7 升级到MySQL 8.0。在此过程当中,您可能须要尝试新的MySQL Shell(mysqlsh)附带的newUpgrade Checker。此实用程序将分析您现有的5.7服务器并告诉您可能的8.0不兼容性。另外一个很好的资源是博客文章 迁移到MySQL 8.0而不会破坏FrédéricDescamps的旧应用程序

在这篇博文中,咱们介绍了服务器功能。还有更多!咱们还将发布其余功能的博客文章,例如复制,组复制,InnoDB群集,文档存储,MySQL Shell,DevAPI和链接器。

这就是如今, 感谢您 使用 MySQL !

相关文章
相关标签/搜索